SQLIndexManager列存储索引维护专题:从行组压缩到一键将堆转换为CCI

发布时间:2026/8/27 17:21:31
SQLIndexManager列存储索引维护专题:从行组压缩到一键将堆转换为CCI SQLIndexManager列存储索引维护专题从行组压缩到一键将堆转换为CCI【免费下载链接】SQLIndexManagerFree GUI Tool for Index Maintenance on SQL Server and Azure项目地址: https://gitcode.com/gh_mirrors/sq/SQLIndexManagerSQL Index ManagerSQLIndexManager是一款免费的 SQL Server 与 Azure 索引维护 GUI 工具除了传统的行存索引维护它还内置了完整的列存储索引维护能力分析行组压缩状态、重建/压缩行组以及一键将堆表转换为 CCI聚集列存储索引。本文带你从原理到操作完整走通这条维护链路。为什么列存储索引需要专门的维护普通 B-Tree 索引的碎片是页与页之间的物理分散而列存储索引的碎片完全是另一个概念。列存储把数据按**行组Row Group**组织每 100 万行约 16MB压成一个行组。数据写入时先以未压缩的 Delta 行组形式暂存等攒够行数后才会被压缩成正式的 Columnstore 行组。维护的核心目标就是把残留的未压缩行组压缩掉缩小体积消除零散的未压缩行组提高列扫描效率对堆表Heap直接补建 CCI把整张表变成列存储在工具内部列存储被识别为两种独立索引类型定义在 Types/IndexType.cs 中CLUSTERED_COLUMNSTORE聚集列存储CCINONCLUSTERED_COLUMNSTORE非聚集列存储NCI行组压缩分析工具如何量化碎片传统索引用sys.dm_db_index_physical_stats算碎片率而列存储没有这套数据SQL Server 提供的是sys.fn_column_store_row_groups函数其中state 1表示未压缩Delta行组。SQLIndexManager 的列存储扫描 SQL 在 Server/Query.cs 中定义核心逻辑是Fragmentation SUM(未压缩行组的 size_in_bytes) * 100.0 / SUM(所有行组的 size_in_bytes)也就是说列存储的碎片率 未压缩行组占用空间占总空间的比例。扫描入口在 Server/QueryEngine.cs 的GetColumnstoreFragmentation方法中同样支持按最小/最大索引大小和碎片阈值过滤只关注真正需要处理的大表。两种修复手段REBUILD 还是 REORGANIZE列存储索引的维护操作定义在 Types/IndexOp.cs 中工具为列存储提供了两套思路方案一REBUILD彻底重建ALTER INDEX [CCL] ON [dbo].[FactTable] REBUILD WITH (DATA_COMPRESSION COLUMNSTORE, MAXDOP 4);可选COLUMNSTORE或COLUMNSTORE_ARCHIVE压缩对应 Types/DataCompression.csArchive 级别压缩率更高、CPU 开销更大适合冷数据注意列存储重建不支持在线ONLINE ON工具在生成脚本时会自动去掉该选项方案二REORGANIZE COMPRESS_ALL_ROW_GROUPS轻量压缩ALTER INDEX [CCL] ON [dbo].[FactTable] REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS ON);只压缩已有行组、不重写整个索引执行快、资源消耗低日常例行维护的首选。操作描述在 Types/IndexOp.cs 中对应REORGANIZE_COMPRESS_ALL_ROW_GROUPS。维护完成后工具还会执行 Server/Query.cs 中的AfterFixColumnstoreIndex查询重新统计该分区的行组页数和剩余未压缩行组在结果中直接展示修完之后还剩多少没压缩让效果一目了然。一键将堆转换为 CCI堆表维护的隐藏大招这是本专题最亮眼的功能。堆表Heap即没有聚集索引的表扫描到后工具可以建议CREATE COLUMNSTORE INDEX操作直接为整张表补建 CCI。Server/Index.cs 中生成的脚本形如CREATE CLUSTERED COLUMNSTORE INDEX [CCL] ON [dbo].[FactSales] WITH (COMPRESSION_DELAY 0, DATA_COMPRESSION COLUMNSTORE);两个参数值得注意COMPRESSION_DELAY 0关闭默认的 60 秒压缩延迟让 Delta 行组尽快被压缩DATA_COMPRESSION COLUMNSTORE明确指定列存储压缩级别执行完成后工具会把该行的类型同步更新为CLUSTERED_COLUMNSTORE见 Server/QueryEngine.cs 中FixIndex方法的收尾逻辑后续再维护时就按列存储流程走了。对于分析型大表堆 → CCI往往比反复 Reorganize 行存索引收益更大体积更小、扫描更快、维护手段也升级成了上面那套行组压缩。扫描配置与命令行自动化列存储的扫描开关在 Settings/Options.cs 中单独控制ScanClusteredColumnstore扫描聚集列存储ScanNonClusteredColumnstore扫描非聚集列存储ScanHeap扫描堆表CCI 转换的前提并且只有当实例确实支持列存储时这两类索引才会加入扫描范围判断逻辑在 Server/QueryEngine.cs 的IsColumnstoreAvailable。在命令行模式下Console/CmdWorker.cs 提供了ignorecolumnstore参数可以只例行维护行存索引、跳过列存储扫描方便你按天/按周拆分维护窗口。小结维护场景推荐操作关键参数例行维护 CCI/NCIREORGANIZECOMPRESS_ALL_ROW_GROUPS ON压缩率不够、数据冷REBUILDDATA_COMPRESSION COLUMNSTORE_ARCHIVE堆表大表、分析型负载CREATE COLUMNSTORE INDEXCOMPRESSION_DELAY 0修复后验证自动回查行组剩余未压缩行组占比SQLIndexManager 把分析行组 → 选择策略 → 生成 T-SQL → 一键执行 → 回查效果整条链路都自动化了列存储索引从此也能像普通索引一样进入你的例行维护计划。【免费下载链接】SQLIndexManagerFree GUI Tool for Index Maintenance on SQL Server and Azure项目地址: https://gitcode.com/gh_mirrors/sq/SQLIndexManager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考