ASSM能减少buffer busy wait,核心是用L1/L2/L3位图块替代串行freelist,允许多会话并行扫描不同位图区域定位空闲块,彻底消除段头争用;实测50并发下响应时间比MSSM低30%~60%,等待事件基本消失。

ASSM 为什么能减少 buffer busy wait
核心原因是位图块(L1/L2/L3)把原来串行访问的段头 freelist 拆成了多个可并行扫描的区域。MSSM 下所有会话默认争抢同一个 freelist(FREELISTS=1),尤其在高并发 INSERT 场景,频繁修改 freelist 链表头导致 buffer busy wait 和 read by other session 等待飙升;而 ASSM 中不同会话可同时读写不同 L1 位图块,段头不再成为瓶颈。
实测 50 并发 INSERT 时,ASSM 的平均响应时间通常比 MSSM 低 30%~60%,且这些等待事件基本消失。但要注意:file#4, block#176 这类 L1 位图块本身也可能成热点——不过 Oracle 已将其分散设计(每个 L1 管理 16 个数据块),实际极少成为瓶颈。
ASSM 的空间复用机制更灵活
MSSM 依赖 PCTUSED 控制块何时重新加入 freelist:块使用率 > 100 − PCTUSED 就被踢出,哪怕只差 1 字节;删除后必须降到 PCTUSED 以下才回收。这容易造成“半空块”堆积,既不能插入新行,又浪费空间。
ASSM 用 4 级位图状态(>75%、50%–75%、25%–50%、PCTUSED,只要位图标记为 25%–50% 或更高,就允许插入——即使块已用掉 76%。这显著提升碎片空间复用率,也消除了因阈值卡顿导致的写入抖动。
-
PCTFREE仍是唯一生效的空间参数,它只控制 UPDATE 扩展预留,不决定 INSERT 资格 -
FREELISTS、PCTUSED、FREELIST GROUPS在 ASSM 表空间中完全被忽略(查dba_tables看不到字段,也不报错) - 盲目调低
PCTFREE(如设为 1)反而增加行迁移风险,尤其对含 CLOB 或大字段的表
为什么 SYSTEM 表空间强制 MSSM 不代表它更优
SYSTEM 表空间强制 SEGMENT SPACE MANAGEMENT MANUAL,不是因为 MSSM 性能更好,而是它的负载特征根本不适合 ASSM:几乎无高并发 DML,主要存放数据字典元数据,更新极低频。拿 SYSTEM 或 UNDO、TEMP 做 ASSM/MSSM 对比测试,结论毫无参考价值。
真正需要 ASSM 的是业务表空间,尤其是:
- 订单库、日志表、实时交易表等高频 INSERT/UPDATE/DELETE 场景
- Oracle RAC 环境下多实例并发写同一张表
- 无法精细调优
FREELISTS或PCTUSED的复杂应用
而 MSSM 仍有其适用场景:归档历史分区、单用户测试库、或遗留系统强依赖 PCTUSED 行为做空间控制。
ASSM 的隐藏成本常被忽略
位图块本身占空间,且随段增长自动分配 L1→L2→L3 层级,这些块计入表空间总使用率,但不会出现在 DBA_EXTENTS 或 DBA_SEGMENTS 的用户对象统计里。如果你只监控 dba_segments.bytes 来评估空间占用,会系统性低估真实消耗。
另外,ASSM 不可在线切换:想从 MSSM 改为 ASSM,必须导出→删表空间→重建→导入,停机不可避免,且重建后 HWM 和空闲块状态全部重置。选型必须在建库初期或迁移阶段定案,上线后再改代价太高。


















