Sql server 为什么Sql Server更喜欢聚集索引扫描而不是非聚集的&x2B;钥匙查询?

Sql server 为什么Sql Server更喜欢聚集索引扫描而不是非聚集的&x2B;钥匙查询?,sql-server,indexing,sql-execution-plan,Sql Server,Indexing,Sql Execution Plan,这是查询和执行计划。已执行注释的create index语句。 为什么Sql Server决定执行聚集索引扫描?我遗漏了什么吗?查询计划可能已缓存。加: option (recompile) 在您的查询结束时强制重新编译。您的问题似乎与此类似- 另外,请查看回答中提到的博客,了解有关此主题的详细概述-如果查询将使用索引,则必须搜索索引页(至少2页),从结果中获取聚集索引键,然后通过聚集索引使用这些键中的每一个进行搜索(每个找到的记录至少读取2页)获取索引未包含的记录的其余部分 如果您有大量记

这是查询和执行计划。已执行注释的
create index
语句。


为什么Sql Server决定执行聚集索引扫描?我遗漏了什么吗?

查询计划可能已缓存。加:

option (recompile)

在您的查询结束时强制重新编译。

您的问题似乎与此类似-


另外,请查看回答中提到的博客,了解有关此主题的详细概述-

如果查询将使用索引,则必须搜索索引页(至少2页),从结果中获取聚集索引键,然后通过聚集索引使用这些键中的每一个进行搜索(每个找到的记录至少读取2页)获取索引未包含的记录的其余部分

如果您有大量记录,并且where子句只选择其中相对较小的一个子集(查询优化器根据索引统计信息估计),那么这将是一种有效的方法

优化器说,从外观上看,表中只有少量记录,可能它们甚至可以放在一个页面上“我可以通过读取和过滤聚集索引中的一到两个页面来完成整个查询,在这种情况下,这比整个非聚集索引业务要有效得多,因此我将这样做,并为我糟糕的过载服务器引擎省下一大堆麻烦”:-)


编辑:尝试使用(索引(idx\U WP\U差异\U过滤器列2))指定在WHERE子句之前,将查询计划中的估计子树成本与原始查询进行比较,以查看两者之间的差异。

添加新索引将导致自动删除任何从属计划。@MartinSmith:建议相反。向查询中引用的表添加索引不在使计划无效的操作列表中。可能不是一个全面的列表。非常确定您将得到一个基于优化的重新编译。您将尝试查找源。@MartinSmith:我的测试表明,添加相关索引后,查询计划仍然有效,请参阅启用了“包含执行计划”。您可以看到,在第二次查询时,该计划确实发生了更改。(修改编辑pastebin链接,将第二个查询放入新批次)您正在选择
*
。索引是否覆盖所有列?表中有多少行?请提供
创建表
,并将查询作为文本,而不是屏幕截图。@MartinSmith,不,索引没有覆盖所有列,这就是我希望进行键查找的原因。但我知道,这是因为sql server的查询优化器根据要扫描的页数估计工作量,而我的表没有那么多数据。是的,根据两个选项的估计成本,这两种策略之间存在一个转折点。第三个选项也适用于大型表,即首先对键进行排序,以便按顺序进行键查找。感谢您的帮助他链接,这篇文章真的很有用。