oracle 11g中assm只能在创建本地管理表空间时通过segment space management auto显式指定,已存在表空间无法修改;system、sysaux及临时表空间不支持assm;需通过dba_tablespaces和dbms_space.space_usage确认实际启用状态。
oracle 11g 中启用 assm 不是“开启一个开关”,而是创建表空间时通过 segment space management auto 显式指定,且必须搭配本地管理(extent management local)。已存在的表空间无法事后修改该属性。
创建新表空间时必须同时满足两个条件
ASSM 只在本地管理的表空间中有效,且只能在建表空间时声明。常见错误是只写 AUTO 却漏掉 LOCAL,或试图对 SYSTEM 表空间启用 —— 这会报错 ORA-12915 或直接被拒绝。
-
EXTENT MANAGEMENT LOCAL是前提,没有它,SEGMENT SPACE MANAGEMENT语句会被忽略 -
SEGMENT SPACE MANAGEMENT AUTO必须紧跟其后,顺序不能颠倒 - SYSTEM、SYSAUX 表空间强制使用 MANUAL,显式指定 AUTO 会失败
- 临时表空间(
TEMPORARY)不支持 ASSM,只能用MANUAL
确认表空间是否真正启用 ASSM
查 DBA_TABLESPACES 只能说明“设计上支持”,不代表段已实际使用位图管理。尤其要注意延迟段创建(SEGMENT CREATION DEFERRED)的表:没插入数据前,段头不存在,也就没有位图块。
- 运行
SELECT tablespace_name, extent_management, segment_space_management FROM dba_tablespaces看字段值是否为LOCAL和AUTO - 对具体表执行
EXEC DBMS_SPACE.SPACE_USAGE('OWNER', 'TABLE_NAME', 'TABLE'),若返回的unformatted_blocks非空,才表示 ASSM 已介入管理 - 如果表刚建完还没 INSERT,
DBA_SEGMENTS里查不到记录,此时 ASSM 实际未激活
迁移到 ASSM 的真实代价和限制
不能 ALTER TABLESPACE 修改已有表空间的段管理方式。想迁移,只能重建:导出数据 → 删除旧表空间 → 新建 ASSM 表空间 → 导入。过程中要注意索引组织表(IOT)的溢出段(overflow segment)默认不继承 ASSM,即使主表空间是 AUTO,也得显式加 INCLUDING 子句。
- ASSM 下
PCTUSED、FREELISTS、FREELIST GROUPS参数被完全忽略,硬写进去也不会报错,但无效 -
INITIAL仍需指定,最小值是 3 个数据块;NEXT在 ASSM 下无意义,会被无视 - 位图块争用可能引发
enq: TX - allocate ITL entry等待,P2 值解码后指向类型为 20 的块(type#=20),普通 SQL 查不到,需用DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE辅助定位
ASSM 的核心不在“配置动作”本身,而在后续 DML 对位图块的真实读写——没数据就没位图,没并发就看不出优势,也没争用。别只盯着建表空间那条 DDL,重点观察数据加载后的空间分配行为和等待事件。











