ASSM用位图块替代freelist,空间定位机制不同:ASSM通过L1/L2/L3位图块分散管理空闲块状态,MSSM依赖段头链表;高并发下ASSM避免段头争抢,PCTUSED在ASSM中完全失效,仅PCTFREE生效。

ASSM用位图块替代freelist,MSSM依赖段头链表
核心区别不在“自动”或“手动”的字面意思,而在空间定位机制:ASSM 把空闲块状态记录在分散的 L1/L2/L3 位图块中,每个位图块只管一小片数据块(比如 L1 管 16 个数据块);MSSM 则把所有空闲块地址串成一条或几条链表,挂载在段头块里。这意味着高并发 INSERT 时,MSSM 会反复争抢修改同一段头块里的 freelist 链表指针,触发大量 buffer busy wait;而 ASSM 中不同会话可同时读写不同 L1 块,段头不再成为瓶颈。
PCTUSED 在 ASSM 中完全失效,PCTFREE 是唯一生效参数
在 MSSM 表空间中,PCTUSED=40 意味着块使用率降到 40% 以下才允许重新插入;而 ASSM 完全无视 PCTUSED,也不认 FREELISTS 或 FREELIST GROUPS——这些参数即使写进 CREATE TABLE 语句也不会报错,但查 DBA_TABLES 看不到对应字段,实际不生效。ASSM 只靠位图的四级状态(>75%、50%–75%、25%–50%、PCTFREE,它只控制 UPDATE 时预留扩展空间,防止行迁移。
判断方式必须查表空间级属性,不能查表或段
很多人执行 SELECT segment_space_management FROM DBA_TABLES WHERE table_name = 'T' 结果为空或报错,因为该字段根本不存在——segment_space_management 是表空间(DBA_TABLESPACES)的属性,不是表或段的属性。正确验证方式只有一条 SQL:
SELECT tablespace_name, segment_space_management FROM dba_tablespaces WHERE tablespace_name = 'USERS';
返回 AUTOMATIC 即 ASSM,MANUAL 即 MSSM。SYSTEM、UNDO、TEMP 表空间强制为 MANUAL,但这不代表性能更优,只是它们几乎无高并发 DML,根本不适合拿来做 ASSM/MSSM 性能对比。
ASSM 的隐藏成本:位图块本身占空间且计入使用率
ASSM 不是零成本的“银弹”。L1/L2/L3 位图块随段增长自动分配,它们占用真实数据文件空间,并被计入表空间总使用率(出现在 DBA_TABLESPACE_USAGE_METRICS),但在 DBA_EXTENTS 或常规空间分析脚本中容易被忽略。尤其当小对象频繁创建/删除时,可能积累大量未释放的位图块。另外,虽然 Oracle 将 L1 分散设计(每个管 16 块),但极端场景下 file#4, block#176 这类固定位置的位图块仍可能成为热点——这不是设计缺陷,而是需纳入监控范围的实际负载点。


















