我的情况是选择较慢的查询计划而不是更快的查询计划,因为我认为这是一些不正确的估计。但是,我无法弄清楚错误估计的来源。下面显示的是更快的计划,由于Index Seek估计成本为123,因此未选择。实际上,从实际和预计执行次数之间的差异可以看出,成本并不高。我的理解是执行次数是由嵌套循环顶端的行数驱动的。如您所见,估计的行数为4878,这与实际非常接近。但是底部输入的估计执行次数是61110,这是远离的。 FWIW,我已经使用全扫描更新了所有表的统计数据,并且1.22估计行是正确的(每次执行)。
61110号码来自哪里,是否有办法解决?
查询如下所示:
SELECT
Top.Pk
FROM
Top
LEFT JOIN Bottom ON Bottom.Fk = Top.Pk
WHERE
Top.Date < GETUTCDATE()
AND Bottom.Fk IS NULL
答案 0 :(得分:3)
虽然我还没有完全理解执行计划在这里向我们展示的内容,但事实证明,通过在索引视图上指定WITH (NOEXPAND)
可以修复问题的这个特定实例,从而强制优化器考虑索引视图上的索引(我认为它已经从执行计划中做了,但显然没有)。