SQL Server前缀键相同的非聚集索引能否合并提升读取性能
SQL Server 索引合并问题解答
直接合并为(COL1,COL2,COL3,COL4)索引不可行
- 非聚集索引的前缀匹配严格遵循键列定义顺序,原
tableA_IDX3的键列顺序为COL1、COL4、COL2,可命中所有携带COL1 + COL4过滤条件的查询;而合并后的索引前缀为COL1 + COL2,无法匹配仅带COL1 + COL4过滤的查询,会直接导致这部分场景的查询性能大幅下降。 - 原
tableA_IDX2的(COL1,COL2,COL3)可以被新索引完全覆盖,这部分查询不受影响,但tableA_IDX3对应的业务场景完全失效,整体读性能反而会下降。 - 仅当实际业务中不存在任何以
COL1 + COL4为核心过滤条件的查询时,才可以直接按你提到的方案合并索引。
可行的优化方案
第一步:删除冗余索引tableA_IDX
现有三个非聚集索引的首列都是COL1,仅以COL1为键列的tableA_IDX属于完全冗余索引,所有能命中tableA_IDX的查询都可以走后续两个更细化的索引,直接删除即可降低INSERT/UPDATE/DELETE操作的索引维护开销,不会对读性能产生负面影响。
第二步:按需调整索引结构降低冗余
如果希望进一步减少索引数量,可根据业务查询优先级选择两种方案:
- 保留原
tableA_IDX2、tableA_IDX3结构,仅删除tableA_IDX,兼顾所有查询场景,同时降低1/3的索引维护成本 - 若
COL1 + COL2的查询频率远高于COL1 + COL4,可将索引调整为键列(COL1,COL2,COL4)+ INCLUDE列COL3,即可覆盖两个原索引的所有查询场景,进一步降低存储和维护开销
内容的提问来源于stack exchange,提问作者S.Hian
相关产品推荐
相关产品推荐

