SQL Server 不自动合并数据页,而是通过 FILLFACTOR 预留空间防页分裂、REBUILD/REORGANIZE 重建或整理索引以提升页密度,并结合监控与归档优化存储效率。

SQL Server 中数据页合并并不是一个内置的自动操作,数据库引擎本身不会主动“合并”空闲的数据页来节省空间。所谓“数据页合并策略”,实际是指通过合理设计和维护手段,减少因页分裂、删除、更新导致的空间碎片和空闲页浪费。
理解数据页填充与预留空间
SQL Server 默认以 8KB 为一页存储数据。当插入或更新行导致页满时,会触发页拆分(Page Split),产生两个半满页,长期积累造成大量低密度页(如平均填充率仅 40%~60%)。这不是“需要合并”,而是要避免过度拆分。
- 使用 FILLFACTOR 在创建或重建索引时预留空间(如 FILLFACTOR = 80 表示页保留 20% 空间),缓解后续插入引发的频繁拆分
- 对写入密集但范围有序的列(如自增 ID、时间戳),可设较高 FILLFACTOR(90~100);对随机插入的 GUID 类型,建议 70~80
- FILLFACTOR 只在索引创建/重建时生效,日常 DML 不动态调整页填充
识别并清理低效页:重建 vs 重组
当已有大量低填充页或逻辑碎片时,需人工干预。核心不是“合并页”,而是重新组织数据物理布局,让有效数据更紧凑。
- ALTER INDEX ... REBUILD:完全重建索引,生成全新页序列,消除内部碎片,重设填充率,适合碎片率 > 30% 或页密度严重偏低的场景
- ALTER INDEX ... REORGANIZE:仅整理叶级页顺序、合并相邻的近乎空页(如两页合计填充不足 50%,且物理相邻),不改变 FILLFACTOR,开销小,适合碎片率 5%~30%
- 注意:REORGANIZE 不会释放已分配但未使用的空间(如大段 DELETE 后的空页),需配合 DBCC SHRINKFILE(谨慎使用)才可能回收文件级空间
控制删除与更新带来的页空洞
大量 DELETE 操作会让页保留在数据文件中,形成“空页残留”。UPDATE 若导致行变长且原页放不下,也可能留下半空页。
- 批量 DELETE 后,若表后续无持续写入,可考虑重建聚集索引(或堆上的 ALTER TABLE ... REBUILD)来压缩剩余数据、丢弃空页
- 避免在窄键上建过多非聚集索引——每条 UPDATE 都需同步更新所有相关索引页,加剧碎片
- 对归档类表,定期将历史数据迁出(如到存档库),再截断(TRUNCATE)或重建,比逐行 DELETE 更高效、更干净
监控与持续优化习惯
靠经验猜测不如用 DMV 定量评估。重点关注页密度与碎片指标:
- 查询 sys.dm_db_index_physical_stats 获取 avg_page_space_used_in_percent(平均页使用率)、avg_fragmentation_in_percent(逻辑碎片率)、page_count、fragment_count
- 对 avg_page_space_used_in_percent
- 将索引维护任务纳入常规运维计划(如每周低峰期执行),而非等性能明显下降才处理










