本地管理表空间(lmt)的空闲区由数据文件头部位图自动跟踪与合并,无需手动执行coalesce;uniform和autoallocate模式下均支持实时归并;assm在此基础上进一步消除段级碎片,但需启用segment space management auto。

本地管理表空间的空闲区由位图自动跟踪
因为本地管理表空间(LMT)不依赖数据字典记录空闲区,而是在每个数据文件头部维护一个位图(bitmap),直接标记哪些数据块已用、哪些空闲。位图本身支持相邻空闲块的逻辑合并——不需要 DBA 手动执行 ALTER TABLESPACE ... COALESCE,也不需要后台定期调度合并任务。
UNIFORM 和 AUTOALLOCATE 两种模式下都不需手动合并
无论你创建表空间时指定 UNIFORM SIZE 1M 还是使用默认的 AUTOALLOCATE,Oracle 都会在分配/释放区时实时更新位图,并隐式完成空闲空间的归并:
-
UNIFORM模式下:所有区大小固定,空闲区天然对齐,位图能精确标识连续的空闲区段,不存在“碎片化”的语义基础 -
AUTOALLOCATE模式下:区大小动态变化(如 64KB → 1MB → 8MB),但位图按数据块粒度管理,仍可识别并报告最大连续空闲块,无需人工干预
对比字典管理表空间(DMT)的缺陷
旧式 DMT 表空间靠 SYS.FET$ 和 SYS.UET$ 两张基表记录区状态,存在两个硬伤:
- 每次分配/释放区都要更新数据字典,高并发时引发基表争用
- 空闲区记录是离散条目,不会自动合并;长期运行后出现大量小空闲区,
INSERT或CREATE INDEX请求大连续空间时可能报ORA-01652: unable to extend temp segment
这种设计下才必须定期跑 ALTER TABLESPACE ... COALESCE,而 LMT 从根源上绕开了这个问题。
ASSM 表空间进一步消除段级碎片
如果表空间还启用了自动段空间管理(即 SEGMENT SPACE MANAGEMENT AUTO),那不仅表空间级空闲区不用合并,段内部的块级空闲空间也由位图管理,自动合并、减少锁争用。注意:SHRINK SPACE 命令只对这类表空间生效,且依赖 LMT 基础 —— 换句话说,LMT 是 ASSM 的前提,不是可选项。
真正容易被忽略的是:即使用了 LMT,如果误建为 SEGMENT SPACE MANAGEMENT MANUAL(手工 freelists 管理),段内碎片仍需人工干预,位图优势只体现在表空间层级,没延伸到段内部。











