Oracle 12c 不支持表空间级延迟段创建,DEFERRED_SEGMENT_CREATION 是实例级静态参数;唯一细粒度控制方式是在 CREATE TABLE 时显式指定 SEGMENT CREATION DEFERRED 或 IMMEDIATE。
oracle 12c 中没有“表空间级别”的延迟段创建控制机制 —— deferred_segment_creation 是实例级参数,只作用于整个数据库,无法按表空间粒度开关。
为什么不能在表空间级别设置 DEFERRED_SEGMENT_CREATION
这个参数是 Oracle 实例启动时读取的静态初始化参数,它影响所有新创建的对象(表、索引、物化视图等),但不区分表空间。即使你在 CREATE TABLESPACE 语句里加任何子句,也不会改变该行为。官方文档和所有实测都确认:不存在 TABLESPACE ... DEFERRED SEGMENT 这类语法或隐含机制。
如何真正控制某张表是否延迟建段
唯一可靠的细粒度控制方式是在 CREATE TABLE 时显式指定 SEGMENT CREATION 子句:
-
SEGMENT CREATION DEFERRED:延续默认行为,不分配物理段,DBA_TABLES.SEGMENT_CREATED显示为'NO' -
SEGMENT CREATION IMMEDIATE:强制立即建段,哪怕表为空,DBA_TABLES.SEGMENT_CREATED立即为'YES'
例如:
CREATE TABLE t1 (id NUMBER) SEGMENT CREATION IMMEDIATE TABLESPACE users; CREATE TABLE t2 (id NUMBER) SEGMENT CREATION DEFERRED TABLESPACE users;
注意:ALTER TABLE ... MOVE 或 ALTER TABLE ... ALLOCATE EXTENT 可以事后触发段创建,但这是补救手段,不是创建时的控制。
修改实例级 _deferred_segment_creation 的真实代价
虽然可以全局禁用延迟段创建,但必须走隐含参数路径,且有硬性限制:
- 必须用
ALTER SYSTEM SET "_deferred_segment_creation"=FALSE SCOPE=SPFILE - 修改后必须重启数据库实例才生效
- 只对重启后新建的对象生效,已有表(无论
SEGMENT_CREATED是 YES/NO)完全不受影响 - 设为
FALSE后,所有新表默认走IMMEDIATE,但你仍可显式写SEGMENT CREATION DEFERRED覆盖它
最容易被忽略的兼容性坑
延迟段创建最隐蔽的风险不在 DDL,而在数据导出工具链:
-
exp(非 Data Pump)在 11g/12c 早期版本中会跳过SEGMENT_CREATED = 'NO'的表,导致迁移后表结构丢失 -
expdp没这个问题,它基于数据字典元数据导出,不管段是否存在 - 某些第三方备份或同步工具若依赖
DBA_SEGMENTS扫描对象,也会漏掉这些“隐形”空表
所以,不要指望靠参数或表空间配置来规避这类问题 —— 关键是明确每张表的建段意图,并在 DDL 中写死 SEGMENT CREATION 子句,这才是可控、可审计、可迁移的做法。


















