我在SQL Server上有一个表,大约有1000万行。它有一个非聚集索引ClearingInfo_idx,如下所示:
我正在运行不使用ClearingInfo_idx索引的查询,执行计划如下所示:
任何人都可以解释为什么查询优化器会选择扫描聚簇索引吗?
答案 0 :(得分:0)
我认为它建议使用此索引,因为您使用了一个尖锐的搜索两列立即和clearingOrder_clearingOrderId。这些值是数字,这些数字很适合搜索。列状态为nvarchar,这不是搜索的最佳状态,并且由于您使用in进行搜索,SQL Server需要搜索其中两个值。
SQL Server将使用两个数字列来获得更快的结果,并在由于在两个数字列上进行精确搜索而减少可能结果的数量后在第二轮中搜索状态。
希望你能得到我的意见。 :-)否则,再问一遍。 : - )
答案 1 :(得分:0)
正如Luaan已经指出的那样,系统更喜欢扫描聚簇索引的可能原因是因为
SELECT *
),将其更改为索引中存在的字段(=索引字段+聚集索引字段),您可能只会使用它来查看它指数。如果您需要一些额外的字段,可以考虑INCLUDE
索引中的那些字段。WHERE
覆盖了90%的记录,那么很少有理由首先创建一个(巨大的)密钥列表,然后再从聚簇索引中获取这些密钥。直接扫描后者然后更有意义。您是否尝试过建议的索引?不确定在桌面上运行了哪些其他查询,但对于这个特定查询,它似乎是对我有效的替代。如果替换将满足其他查询是另一个问题当然。添加额外的索引可能会对您的IUD操作产生负面影响,并且需要更多的磁盘空间;没有免费的午餐=) 也就是说,如果性能是一个问题,您是否考虑过滤索引? (再一次,没有免费的午餐;这都是优先事项)