_DEFERRED_SEGMENT_CREATION 是控制Oracle空表是否延迟分配物理段的隐含参数,默认TRUE,设为FALSE后新建空表立即建段,需重启生效,影响空间使用与工具兼容性。
什么是 _DEFERRED_SEGMENT_CREATION 参数
这个参数控制 oracle 数据库是否在创建空表(或分区、物化视图等)时**跳过物理段分配**。开启时,create table 执行完,数据字典里有对象定义,但磁盘上没分配任何 extent —— 表看起来“存在”,却查不到 dba_segments 记录,直到第一次插入数据才真正建段。
怎么查和改这个参数
它是个隐含参数,不能用常规 SHOW PARAMETER 查,必须走 x$ksppi/x$ksppcv;修改需重启实例,且只影响新创建的对象,已有表不受影响。
- 查当前值:
SELECT ksppinm, ksppstvl FROM x$ksppi a, x$ksppcv b WHERE a.indx = b.indx AND ksppinm = '_deferred_segment_creation';
- 设为
FALSE(禁用延迟段):ALTER SYSTEM SET "_deferred_segment_creation"=FALSE SCOPE=SPFILE;
—— 注意必须用SCOPE=SPFILE,且重启后才生效 - 设为
TRUE(默认):不建议手动设,除非明确需要控制新建空表行为
为什么有人想关掉它
延迟段看似省空间,但在某些场景反而埋雷:
- 应用依赖
dba_segments或user_segments判断表是否存在 —— 关掉后,空表不会出现在这些视图里,导致逻辑误判 - 备份/同步工具(如 Data Pump、OGG)可能跳过未建段的表,恢复后发现“表丢了”
- 分区表加新分区时,若主表是延迟段,新分区也不会立即建段,容易被忽略
-
DBA_TABLES.segment_created字段显示NO,但开发或 DBA 误以为表损坏或创建失败
关了之后要注意什么
关掉 _DEFERRED_SEGMENT_CREATION 后,所有新建的空表都会立刻分配初始 extent(哪怕只建个空表),这会带来两个实际影响:
- 表空间必须有足够空闲空间,否则
CREATE TABLE直接报ORA-01653(即使你马上要删它) - 大量建空表的脚本(比如自动化测试、模板初始化)性能会略降,因为多了段分配和数据字典更新开销
- 已存在的延迟段表不会自动补段,得手动触发:
INSERT INTO t VALUES (1); COMMIT; DELETE FROM t; COMMIT;或用ALTER TABLE t ALLOCATE EXTENT;










