【发布时间】:2019-09-12 18:24:57
【问题描述】:
我正在努力提高我们的 SQL 性能。 SQL Server Management Studio 给出了一个令我惊讶的建议。为了示例,我将简化表结构和 SSMS 给出的建议。
Person的表结构:
- 身份证
- 名字
- 姓氏
- date_of_birth
- 电子邮件
我有一个特定的查询,我展示了它的执行计划。然后我看到了 SSMS 给出的建议,这让我有点惊讶。建议添加两个具有以下签名的索引,分别将性能提高 41% 和 53%:
CREATE NONCLUSTERED INDEX [person_1]
ON [Person]([first_name],[last_name])
INCLUDE ([id],[date_of_birth],[email])
CREATE NONCLUSTERED INDEX [person_2]
ON [Person]([first_name],[last_name])
INCLUDE ([id],[email])
这两个索引在同一列上。只有 INCLUDE 列不同。我从阅读索引中的理解是,第一个索引也包括第二个索引的数据。那么为什么 SSMS 推荐第二个索引,而第一个索引已经包含了需要的数据呢?
【问题讨论】:
-
我无法解释为什么 SSMS 推荐这两个索引。正如您所注意到的,第一个索引是第二个索引的超集,因此不需要第二个索引。我的猜测是您有一个非常复杂的查询,查询的不同部分可能使用一个或另一个索引。或者,使它们不同的索引之间可能存在细微的区别,例如按降序排列的列。
-
我同意你的看法。如果您已经有了第一个,则第二个无关紧要。也许......如果您的查询不使用列
date_of_birth,它可能会稍微快一点;但差异可能可以忽略不计。 -
感谢两位的意见。我给出的例子确实是一个非常大而复杂的查询的简化。我有点信任 SSMS,但审稿人说他不理解这个建议。好在不要再盲目相信它了。
标签: sql sql-server tsql database-indexes sql-server-performance