优化聚簇索引扫描成聚簇索引搜索

时间:2018-10-15 11:54:35

标签: sql-server-2012

有一种情况,我有一个包含40列的表,并且我必须选择一个表的所有数据(包括所有列)。我在从表中获取完整数据集的同时,在表上创建了聚集索引,包括聚集索引扫描

我知道没有任何过滤器或联接键,SQL Server将选择集群索引扫描,而不是集群索引搜索。但是,我想通过将 Clustered Index Scan 优化为 Clustered Index Seek 来优化执行计划。有什么解决方案可以做到这一点吗?请分享。

以下是执行计划的屏幕截图: enter image description here

1 个答案:

答案 0 :(得分:1)

问题/请求中的某些内容不太正确,因为您要的内容会表现不佳。我怀疑这是由于误解了聚集索引是什么。

聚簇索引-也许更好地表述为聚簇表-是数据表,它不独立于表,而是 表。如果表上数据的顺序已经基于ITEM ID,则扫描是查询的最有效的访问方法(尤其是给定select *)-您根本不想在这种情况下进行查找-而且我不认为这是您遇到的情况,因为有排序运算符。

如果集群表是根据另一个字段排序的,那么您将需要一个附加的非集群索引来提供正确的顺序。然后,您将尝试强制执行非聚集索引扫描,嵌套循环到聚集索引查找的计划。可以使用查询提示来实现,很可能是INNER LOOP JOIN会导致搜索-但也存在可以使用的FORCESEEK

从性能角度来讲,第二个选择永远不会取胜-您实际上是在关注临界点(https://www.sqlskills.com/blogs/kimberly/the-tipping-point-query-answers/