为什么Sql Server更喜欢Clustered Index Scan over NonClustered + KeyLookup?

时间:2013-06-19 14:11:57

标签: sql-server indexing sql-execution-plan

所以这是查询和执行计划。已注释的create-index语句已被执行。 enter image description here

为什么Sql-Server决定执行聚簇索引扫描?我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

您的问题与此问题类似 - Why is there a scan on my clustered index?

另请查看答案中提到的博客,以便对此主题进行详细概述 - http://www.sqlskills.com/blogs/kimberly/the-tipping-point-query-answers/

答案 1 :(得分:3)

如果查询将使用索引,则必须搜索索引页(至少为2),从结果中获取聚簇索引键,然后通过聚簇索引使用这些键中的每一个进行搜索(每个找到的记录至少读取2页,以获得索引未涵盖的其余记录。

可以是一种有效的方法,如果你有大量的记录,你的where子句只选择它们的相对较小的子集(查询优化器估计的基于索引统计数据)。

从它的外观来看,你在表中只有少量记录,也许它们甚至可以放在一个页面上,所以优化者说“我可以通过阅读和过滤一两页来完成整个查询。聚集索引一次,在这种情况下比整个非聚集索引业务更有效,所以我会这样做,并为我的可怜的重载服务器引擎节省了一大堆麻烦“: - )

编辑:尝试在WHERE子句之前指定WITH(INDEX(idx_WP_Discrepancy_FilterColumns2)),并将查询计划中的估计子树成本与原始查询进行比较,以查看差异。

答案 2 :(得分:0)

可能会缓存查询计划。添加:

option (recompile)

在查询结束时强制进行全新编译。