前言
业务系统大量执行 DELETE、UPDATE 后,索引会逐步产生碎片,引发索引空间膨胀、查询 IO 上升,影响业务访问性能。DM9 提供SP_REORGANIZE_INDEX_ONLINE存储过程,支持业务不停机完成索引碎片整理回收。很多运维人员只掌握调用方式,对碎片形成原因、工具适用范围、使用限制缺少系统认知。本文从使用者角度介绍碎片产生的外在表现、碎片评估方法、在线整理的使用特性与能力边界,用于指导生产运维。
1 索引碎片与高水位的外在表现
数据库执行 DELETE 属于逻辑标记删除,不会立刻回收磁盘物理空间。
- 数据表高水位代表表曾经使用过的数据边界,DELETE 操作不会下压该边界;
- 索引碎片产生:大量记录被逻辑删除后,索引页内部会出现空闲位置。如果这些空闲位置无法被新写入数据复用,数据库会持续申请新索引页,最终造成索引整体空间膨胀。
重要区分:SP_REORGANIZE_INDEX_ONLINE作用对象仅为索引,用于回收索引内部空闲页;该存储过程不处理数据表高水位。数据表高水位的下降,需要通过表空间收缩、重建表等其他运维手段实现。
2 碎片率的两种评估思路
不建议依靠单一指标判断碎片情况,实际运维中一般采用两种方式交叉参考:
- 索引页统计方式:读取系统公开视图中元数据,统计索引已使用页与总页占比,适合索引碎片快速评估,查询开销小。
- 固定补偿行长法:用于数据表碎片评估。基于表平均行长度、有效数据行数,计算理论理想占用页数,和实际物理页数做对比,扣除页结构固定开销,评估表的存储膨胀程度。
测试实践现象:小数据规模场景很难产生有效碎片。数据量较小时,删除产生的空闲空间会被新数据快速复用。想要观察明显碎片现象,需要放大数据规模,提高删除占比,叠加更新操作,才能构造可观测的碎片场景。
3 SP_REORGANIZE_INDEX_ONLINE 对外可观测行为
在线索引碎片整理在业务运行期间执行,不会阻塞普通 DML 读写业务,对外表现行为如下:
- 遍历索引,剔除逻辑删除的记录,紧凑归并索引内有效数据;
- 将完全空闲的索引页归还表空间,实现存储空间回收;
- 执行过程中索引可正常对外访问;任务发生中断后,支持重新调用继续完成整理。
4 产品使用边界说明
- 超宽索引场景限制:DM9 不支持索引填充因子语法。在线整理可以合并页内空闲空间,但无法预留在页内预留空闲位置。部分特殊索引场景仅靠在线整理无法把碎片完全消除;如需彻底清理,可采用表空间收缩结合索引重建的方案。
- 分区索引支持情况:LIST 分区的本地索引、全局索引均支持在线碎片整理;各分区处理相互隔离,不破坏分区业务语义。
5 运维实践建议
- 区分索引碎片与数据表碎片,在线整理只解决索引层面的空间膨胀,不能降低表高水位;
- 碎片评估建议两种统计方式交叉校验,避免单一指标带来误判;
- 针对超宽索引、大分区表,提前认知工具能力边界,按需选择在线整理或者索引重建。
小结
理解碎片产生的业务表现和工具适用边界,才能合理使用SP_REORGANIZE_INDEX_ONLINE。该工具是国产化环境下不停机回收索引空间的重要手段,但存在明确使用约束,生产环境需要结合业务数据模型选用。