ASSM已全面取代MSSM,因其自9i起成为LMT默认模式,11gR2后新建非SYSTEM表空间均默认AUTO;MSSM的FREELIST/PCTUSED机制在ASSM中失效,高并发下ASSM通过位图块避免争用,且仅PCTFREE仍有效。
assm 是当前唯一合理的选择,mssm 仅存在于遗留系统或极特殊测试场景中;新环境不要考虑 mssm。
为什么 ASSM 已全面取代 MSSM
Oracle 自 9i 引入 ASSM 后,就明确将其设为本地管理表空间(LMT)的默认段空间管理模式。11gR2 起,所有新建的非 SYSTEM 表空间默认启用 SEGMENT SPACE MANAGEMENT AUTO。MSSM 的核心机制 —— FREELIST 和 PCTUSED —— 在 ASSM 下完全失效,即使显式指定也会被忽略。
-
FREELIST和FREELIST GROUPS参数在 ASSM 表空间中不生效,DDL 中设置会被静默丢弃 -
PCTUSED不再存在语义,ASSM 使用位图状态(如0-25%、25-50%空闲)替代该阈值判断 - 高并发插入时,MSSM 的 freelist 链争用会直接导致
buffer busy wait和read by other session等等待事件激增,ASSM 通过并行访问不同位图块彻底规避此问题 - ASSM 的位图结构(L1/L2/L3 BMB)自动适配段增长,无需 DBA 手动调优
FREELISTS数量或估算PCTUSED合理值
如何确认当前表空间使用的是 ASSM
执行以下查询,检查 SEGMENT_SPACE_MANAGEMENT 列是否为 AUTO:
SELECT tablespace_name, extent_management, segment_space_management FROM dba_tablespaces WHERE tablespace_name = 'USERS';
若返回 AUTO,即为 ASSM;若为 MANUAL,则为 MSSM(极少见)。注意:SYSTEM 表空间强制为 MSSM,且不可更改。
- 查询某张表所在表空间的管理模式,不能只查表本身,必须查其所属表空间 —— 段空间管理是表空间级属性,不是对象级
-
dba_segments视图中没有段空间管理方式字段,误查此处会白忙一场 - 若发现
segment_space_management为MANUAL,基本可判定该库建库时未启用 LMT,或人为降级过,应尽快迁移
ASSM 下唯一需要关注的参数:PCTFREE
在 ASSM 中,PCTFREE 是唯一仍有实际作用的空间参数,它决定数据块中预留多少空间供后续 UPDATE 扩展行数据(防止行迁移)。其余如 INITRANS、MAXTRANS 仍有效,但已与空间管理无关。
-
PCTFREE值影响块内“可用空间下限”:即使块空闲率低于该值,只要位图标记为25-50%或更高,仍可接受新插入 - 典型值为
10(10%),写密集型表可设为5,更新频繁且行长大(如含CLOB)的表建议15~20 - 不要试图通过调低
PCTFREE来“省空间”——ASSM 会自动复用碎片空间,盲目压低反而增加行迁移风险
真正容易被忽略的点
ASSM 的位图块(BMB)本身也占用段空间,且随段增长动态分配。一个刚创建的小表可能只有 1 个 L1 位图块,但当段扩展到数百 MB 后,L1/L2/L3 多层结构会占用可观的块(例如前 128 个块中,0–127 号块在 11g 中很可能全是位图相关块)。这些块不存用户数据,但计入 DBA_SEGMENTS.BLOCKS 统计,容易误导容量评估。
- 用
ALTER SYSTEM DUMP DATAFILE <file_id> BLOCK <block_id></block_id></file_id>查看块内容时,若看到type: 20(bitmapped block)或大量0x00/0xFF位图标记,就是位图块,不是数据块 - 监控空间使用率时,别只盯
dba_free_space,要结合dba_segments和实际数据行数做交叉验证 - 跨平台迁移或使用
EXPDP/IMPDP时,ASSM 表空间的位图结构不导出,导入后由 Oracle 自动重建,无需干预


















