1 段延迟分配
通过参数开启段延迟分配(默认开启):DEFERRED_SEGMENT_CREATION = TRUE
当创建一个非分区堆表(默认create table语句创建的为堆表)时,表段的创建被延迟到第一行插入。也就是在插入第一行数据时才会分配相应的段空间,否则不分配空间。默认情况下启用此功能,并将DEFERRED_SEGMENT_CREATION初始化参数设置为TRUE。
这种空间分配方法的优点:
对于在安装时创建数百或数千个表的应用程序,可以节省大量磁盘空间,其中许多表可能永远不会被填充。
应用程序安装时间减少了。
当将第一行插入到表中时,将为基表、其LOB列和其索引创建段。在段创建期间,表上的游标失效。这些操作对性能有很小的影响。
注意:对于这种分配方法,必须进行适当的容量规划,以便在填充表时数据库有足够的磁盘空间来处理段创建。
2 查看段延迟信息
SQL> SHOW PARAMETERS deferred_segment_creation
NAME TYPE VALUE
------------------------------------ ----------- ------
deferred_segment_creation boolean TRUE
SQL> CREATE TABLE seg_test(c number, d varchar2(500));
Table created.
SQL> SELECT segment_name FROM user_segments;
no rows selected
SQL> INSERT INTO seg_test VALUES(1, 'aaaaaaa');
1 row created.
SQL> SELECT segment_name FROM user_segments;
SEGMENT_NAME
-------------------------------------------------------
SEG_TEST
如上在创建表之后,没有段空间,直到插入数据之后才会分配空间,产生段信息。
3 段创建的控制
可以通过两种方式控制段的创建:
将DEFERRED_SEGMENT_CREATION初始化参数设置为TRUE或FALSE。可以在初始化文件中设置此参数。还可以通过ALTER SESSION或ALTER系统命令来控制它。
例子:
ALTER SESSION SET DEFERRED_SEGMENT_CREATION = TRUE;
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION = FALSE;
使用CREATE TABLE命令的创建子句:
延迟创建段:如果指定了,则延迟创建段,直到第一行插入到表中。这是Oracle数据库11g发行版2及其后续发行版的默认行为。
立即创建段:如果指定,段将在表创建期间具体化。这是Oracle数据库11g发行版2之前Oracle数据库中的默认行为。
示例:
CREATE TABLE SEG_TAB3(C1 number, C2 number)
SEGMENT CREATION IMMEDIATE TABLESPACE SEG_TBS;
CREATE TABLE SEG_TAB4(C1 number, C2 number)
SEGMENT CREATION DEFERRED;
此子句优先于DEFERRED_SEGMENT_CREATION参数的设置。
可以使用ALTER table…MOVE命令强制为已经创建的表创建段。
但是,不可能直接控制依赖对象(如索引)的延迟段创建。它们继承父的特性,在以上示例中父为表。
4 段延迟的应用范筹
延迟段的创建仅限于非分区表和非分区索引。
对于 IOTs, clustered tables, global temp tables, session-specific temp tables, internal tables, typed tables, AQ tables, SYS-owned tables, external tables, bitmap join indexes, and domain indexes,不支持按需创建段。SYSTEM、PUBLIC、OUTLN和XDB所拥有的表也被排除在外。
对于在字典管理的表空间中创建的表和聚簇表,不支持按需创建段。它们会创建段。
如果在本地管理的表空间上创建一个具有延迟段创建的表,那么它没有段。如果以后将表空间迁移到字典管理,任何创建段的尝试都会产生错误。在这种情况下,必须删除表并重新创建它。
5 段的特性
不会为不可用的索引和索引分区分配段。
这种方式创建索引没有段:
CREATE INDEX test_i1 ON seg_test© UNUSABLE;
删除索引的段:
ALTER INDEX test_i UNUSABLE;
为索引创建段
ALTER INDEX test_i REBUILD;
所有不可用的索引和索引分区都不会创建段。这个功能对您来说是完全透明的。
示例:如果有一个带有三个分区和一个本地索引的演示表,那么在执行查询时会看到三个表和三个索引段。
如果在将一个表分区移动到一个新的表空间之后执行相同的查询,会看到三个表段和只有两个索引段,因为不可用的索引会被自动删除。
6 练习题
如下哪两个说法是正确的?
A Deferred segment creation is always enabled. You cannot control it.
B You can control the deferred segment creation with the SEGMENT CREATION clause of the CREATE TABLE command.
C Segment creation on demand is available for all types of tables, including those owned by the SYS user.
D Segment creation on demand is available for nonpartitioned tables.




