2

所以这里是查询和执行计划。注释create-index语句已经被执行。 在此处输入图像描述

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

4

3 回答 3

3

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

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

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

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

于 2013-06-19T16:13:17.467 回答
3

您的问题似乎与此类似 -为什么对我的聚集索引进行扫描?

另请查看答案中提到的博客,以获得有关此主题的良好概述 - http://www.sqlskills.com/blogs/kimberly/the-tipping-point-query-answers/

于 2013-06-19T14:32:15.530 回答
0

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

option (recompile)

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

于 2013-06-19T14:27:52.380 回答