问题:
现在安装某应用有成百上千的表和索引,且每个表和索引初始化分配10MB区间。当部署该DDL到生产环境,而又想尽可能快地安装该数据库对象。于是意识到,如果创建时每个对象分配10MB磁盘空间,要花费一些时间去部署这DDL。现在你想知道,是否能以某种方式指示oracle推迟每个对象的初始分区分配,直到实际数据插入表中。
方法:
唯一推迟初始段分配的方法就是使用oracle 11g R2。该版本以上的数据库,默认情况,为表(及相关索引)物理分配区间被推迟,直到第一条记录插入表中。以下是实例证明,首先创建表:
SYS@orcl> conn scott/scott
Connected.
SCOTT@orcl> create table test(id number,name varchar2(200));
Table created.
SCOTT@orcl> select count(*) from user_segments where segment_name = 'TEST';
COUNT(*)
----------
0
1 row selected.
SCOTT@orcl> SELECT COUNT(*) FROM USER_EXTENTS WHERE SEGMENT_NAME='TEST';
COUNT(*)
----------
0
1 row selected.
1 row created.
SCOTT@orcl> select count(*) from user_segments where segment_name = 'TEST';
COUNT(*)
----------
1
1 row selected.
SCOTT@orcl> SELECT COUNT(*) FROM USER_EXTENTS WHERE SEGMENT_NAME='TEST';
COUNT(*)
----------
1
1 row selected.
这一行为不同于oracle 11gR2之前的版本,先前的版本,一创建对象就分配段和相关分区。推迟段分配也可用于分区表和分区索引。只有实际数据插入才分配区间。
工作原理:
从oracle 11g R2开始,随着在本地管理的表空间里创建非分区堆组织表,初始段创建被推迟,直到实际数据插入表中。需要留意oracle推迟段创建特性的一些原因:
允许带有成百上千表和索引的应用快速安装,这可以改善安装速度,特别是有成千的对象时。
做为一个dba,当你注意到没有可用空间分配给对象时,你的空间使用报告让你很困惑。
第一行记录创建时间会比之前版本稍微长点(因为现在oracle要在创建第一行记录前分配第一个区间)。对于大部分应用,这一性能降退可以忽略。
要利用这一特性的唯一办法就是升级到oracle 11gR2,很多时候这不是可选的。然而,我觉得讨论这一特性很重要,因为当你开始使用oracle最新版本时,最终会遇到上述特性。
你可以禁止延迟段创建特性,通过设置数据库初始化参数deferred_segment_creation为false。默认值为true。
当创建表时,你也可以控制延迟段创建行为。这时,create table语句有两个新子句:
segment creation immediate 和 segment creation deferred,例如:
create table test(
id number,
name varchar2(200))
segment creation immediate;
注意:使用segment creation immediate 子句前,COMPATIBLE初始化参数须是11.2.0.0.0以上。
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 11.2.0.0.0
SCOTT@orcl>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27795363/viewspace-744453/
,如需转载,请注明出处,否则将追究法律责任。