所以这是查询和执行计划。已注释的create-index
语句已被执行。
为什么Sql-Server决定执行聚簇索引扫描?我错过了什么吗?
答案 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)
在查询结束时强制进行全新编译。