非聚集索引替代咨询:键列顺序不同时,含更多INCLUDE列的索引能否替代另一索引
非聚集索引替换可行性分析
你创建的两个非聚集索引如下:
Index #1
CREATE NONCLUSTERED INDEX [index1] ON [dbo].[table1] ([column1], [column2], [column3]) INCLUDE ([column4], [column5], [column6]) WITH (ONLINE = ON)
Index #2
CREATE NONCLUSTERED INDEX [index2] ON [dbo].[table1] ([column2], [column1], [column3]) INCLUDE ([column4], [column5]) WITH (ONLINE = ON)
针对你提出的「能否删除index2,由index1承接原index2服务的所有查询」的问题,答案不能一概而论,需要结合依赖index2的查询场景判断:
不能直接删除的场景
如果原index2服务的查询是以column2作为首要过滤或排序条件的(比如WHERE column2 = N'xxx'、WHERE column2 > N'xxx' ORDER BY column2这类未用到column1过滤的语句),index1的键列顺序(以column1为首)无法高效支持这类查询。此时SQL Server需要扫描整个index1才能找到匹配column2的数据,性能会远低于使用index2时的索引seek操作,这种情况下不能删除index2。可以考虑替换的场景
如果依赖index2的查询同时用到column1和column2作为过滤条件(比如WHERE column1 = N'a' AND column2 = N'b'),或者排序逻辑与index1的键列顺序匹配(比如ORDER BY column1, column2),那么index1不仅能满足查询需求,其包含的更多INCLUDE列还可能覆盖更多查询场景,减少回表操作,这种情况下index2可以被index1替代。
建议操作步骤
- 查看
sys.dm_db_index_usage_stats视图,确认index2的具体使用频率和场景; - 针对依赖index2的核心查询,模拟删除index2后的执行计划,对比性能变化;
- 确认所有查询都能通过index1高效执行后,再删除index2。
内容的提问来源于stack exchange,提问作者user1532449
相关产品推荐
相关产品推荐

