这两个索引声明之间有什么区别,我是否都需要?

rob*_*rtc 4 index sql-server index-tuning

我正在检查一个带有“显示估计执行计划”的脚本,它为添加到数据库的索引提出了一些建议。我添加了它们,脚本确实运行得更快了。现在我正在考虑将这些放入我们的标准表单中以包含在我们的常规升级脚本中,我注意到可能存在冗余:

CREATE NONCLUSTERED INDEX [TableA_ColA]
ON [dbo].[TableA] ([ColA])
INCLUDE ([ColB])
GO

CREATE NONCLUSTERED INDEX [TableA_ColB_ColA]
ON [dbo].[TableA] ([ColB],[ColA])
GO
Run Code Online (Sandbox Code Playgroud)

我可以从文档中看到就空间使用而言,两个索引之间存在一些差异,但在这种情况下ColAisintColBis nvarchar(255),远远低于 900 字节的限制,所以我不确定INCLUDE第一个索引中的是必要的。

那么这只是执行计划分析器的任意结果吗?在我看来,如果我有第二个索引,第一个索引是多余的吗?

Mar*_*ith 10

它们满足不同的查询。

第一个对于搜索ColA = X和返回的查询很有用ColB(没有INCLUDE这将需要查找回基表)

第二个对于寻求以下内容的查询很有用 ColB = Y

它们都可以用于查询,ColA = X AND ColB = Y但第二个将更有效地执行此操作,因为第一个索引需要查找,ColA然后针对所有匹配的索引行评估剩余谓词。