ASSM是Oracle 9iR2后默认段空间管理机制,弃用freelists而采用位图块动态跟踪块状态;INITRANS和PCTFREE成为可控并发参数,直接路径插入(APPEND)可绕过位图调度。
assm(automatic segment space management)不是“可选优化项”,而是 oracle 9ir2 之后默认启用的段空间管理机制;它不依赖 freelists,也不响应 freelist groups,强行设置只会制造假象——你看到建表语句里写了,但数据库根本不用。
ASSM 下 FREELISTS 参数为什么完全无效
在 SEGMENT SPACE MANAGEMENT AUTO 的表空间中,Oracle 彻底弃用 freelist 链表结构,改用位图块(bitmap block)动态跟踪每个数据块的空闲/已用状态。这意味着:
-
FREELISTS和FREELIST GROUPS值在USER_TABLES中恒为 1,无论建表时是否显式指定 - 执行
ALTER TABLE ... STORAGE(FREELISTS 4)不报错,但查询USER_TABLES仍显示 1,且性能无任何变化 - 常见误判场景:批量插入卡在
enq: TX - allocate ITL entry,以为加 freelist 能缓解,实则是INITRANS或PCTFREE不足
INITRANS 和 PCTFREE 才是 ASSM 下真正可控的并发参数
ASSM 管理的是“哪些块可用”,但每个块能容纳多少并发事务,取决于块头里的 ITL 槽数量和预留空间——这两者由 INITRANS 和 PCTFREE 控制:
-
INITRANS决定数据块初始化时分配的 ITL 槽数量(默认 2),高并发 INSERT/UPDATE 场景建议设为 8~16 -
PCTFREE控制块内预留空间比例(默认 10%),用于后续扩展 ITL 或更新变长字段;若字段长度波动大,或 UPDATE 频繁,建议调至 15~20% - 注意:
INITRANS只在块首次格式化时生效,已有数据块需通过ALTER TABLE ... MOVE重建才重置 ITL
直接路径插入(/*+ APPEND */)绕过 ASSM 位图调度
常规 INSERT 会触发 ASSM 位图查找逻辑(L3→L2→随机 L1→具体块),可能跨多个分散位置,引发 buffer busy waits;而 /*+ APPEND */ 完全跳过这层调度:
- 从高水位线(HWM)上方直接分配新区(extent),写入连续空闲块
- 不检查位图,不竞争 L1 块,天然规避
read by other session类等待 - 副作用:不走 buffer cache,无法回滚(仅对当前事务可见),且会抬高 HWM,造成空间浪费
- 适用场景:ETL 批量加载、日志归档表写入等“只追加、少更新”的情况
ASSM 位图块本身不可见、不可干预
你查不到、改不了、也别想绕过它——位图信息物理存储在段头后几个类型为 type#=20 的特殊数据块中,Oracle 内部保护严密:
-
DBA_EXTENTS、DBA_SEGMENTS只暴露逻辑结构,不反映位图布局 - 试图用
BBED或X$KTFBUE强行解析,极易触发ORA-00600内部错误 - 唯一可控入口是表空间级创建时指定
SEGMENT SPACE MANAGEMENT AUTO,之后无法降级或关闭
真正影响 ASSM 并发表现的,从来不是“怎么调位图”,而是你让每个数据块准备好多少 ITL、留出多少空间、以及是否让大批量写入绕开位图争抢——这些点一旦设错,加再多 freelist 也没用。











