所以这里是查询和执行计划。注释create-index
语句已经被执行。
为什么 Sql-Server 决定执行聚集索引扫描?我错过了什么吗?
所以这里是查询和执行计划。注释create-index
语句已经被执行。
为什么 Sql-Server 决定执行聚集索引扫描?我错过了什么吗?
如果查询将使用索引,则必须搜索索引页(至少 2 个),从结果中获取聚集索引键,然后使用这些键中的每一个通过聚集索引(至少 2页面读取每个找到的记录)以获取索引未涵盖的其余记录。
如果您有大量记录并且您的 where 子句仅选择其中相对较小的子集(查询优化器根据索引统计信息估计) ,这可能是一种有效的方法。
从外观上看,您的表中只有少量记录,也许它们甚至可以放在一页上,因此优化器说“我可以通过一次读取和过滤聚集索引中的一两页来完成整个查询,在这种情况下,这比整个非聚集索引业务更有效,所以我会这样做,并为我可怜的超载服务器引擎省去一大堆麻烦”:-)
编辑:尝试在 WHERE 子句之前指定 WITH (INDEX(idx_WP_Discrepancy_FilterColumns2)) 并将查询计划中估计的子树成本与原始查询进行比较以查看差异。
您的问题似乎与此类似 -为什么对我的聚集索引进行扫描?
另请查看答案中提到的博客,以获得有关此主题的良好概述 - http://www.sqlskills.com/blogs/kimberly/the-tipping-point-query-answers/
查询计划可能被缓存。添加:
option (recompile)
在查询结束时强制重新编译。