延迟段创建本质是不分配物理空间,表无数据时SEGMENT_CREATED为'NO'且零字节占用;1000张空表省64MB,但EXP跳过此类表,DBA_SEGMENTS查不到,首次INSERT才触发段分配,DEFERRED_SEGMENT_CREATION改后需重启且不影响已有空表。
延迟段创建的本质是“不分配物理空间”
它不是“延迟写数据”,而是根本不去申请任何 extent。只要表没插入第一行,user_segments 里就查不到该表的记录,segment_created 字段值为 'no',表空间里零字节占用——连一个 8kb 的块都不占。
空表数量多时,节省量很真实
假设默认 INITIAL extent 是 64KB(常见于 db_block_size=8K、uniform size 64K 的 LMT),1000 张空表就省下约 64MB;1 万张就是 625MB。这不是理论值,是实际未写入磁盘的物理空间。
但要注意:节省是有代价的
-
EXP(旧版导出工具)完全跳过SEGMENT_CREATED = 'NO'的表,备份里没结构也没数据 -
DBA_TABLES能查到表,DBA_SEGMENTS查不到段,监控脚本若只依赖后者会漏报 - 首次
INSERT会触发段分配 + 数据写入,可能引发短暂锁等待或空间争用(尤其在自动扩展慢的文件系统上) - 统计信息收集对
SEGMENT_CREATED = 'NO'的表无效,优化器可能选错执行计划
真正容易被忽略的点
参数 DEFERRED_SEGMENT_CREATION 修改后必须重启实例才生效,且只影响新建对象;已有空表不会自动补段。哪怕你把参数设成 FALSE,那些已经建好但还没插数据的表,依然停留在 'NO' 状态,得手动 ALTER TABLE ... ALLOCATE EXTENT 或插删一行来触发建段。











