2016-04-18 51 views
0

从图中可以看出: Query1和Query2在表和where子句中是相同的。但是,当我从地址表索引添加一个字段从索引扫描到表扫描。我的问题是为什么?为什么选择字段会改变索引扫描类型?

注:我看到推荐索引,但我不认为我有权更改数据库。

enter image description here

+0

检查聚簇索引... – Devart

回答

2

这是很有可能发生的事情更多,因为StateProvCode不在地址表中的PK列,也不是一个包含列。因此,SQL Server必须确定简单地扫描表,而不是扫描PK,然后在Address表中进行额外的查找以获取每行的StateProvCode值,这将会更便宜。您的性能可能不会受到太多影响,因为扫描索引可能只比扫描表格快一点(除非您有适当的过滤索引)。当然,正如你所看到的,你可能需要创建一个索引来真正提高性能。

+0

同意。从某种意义上说,索引是针对特定搜索优化的另一个表。如果所需字段未被该索引覆盖,则它基本上被加入到它的父表*(过滤索引,加入到表中,获取字段)*。在这种情况下,优化器决定扫描整个表格会更便宜,而不是使用索引,但会招致加入“加入”的成本。这可能是正确的,但有时并非如此。也许你可以检查所有相关统计数据是否是最新的?或者也许使用表格提示来强制使用索引并比较成本? – MatBailie

相关问题