"Estimated Number of Executions" 膨胀了

"Estimated Number of Executions" is inflated

我有这样一种情况,我选择了较慢的查询计划而不是较快的查询计划,我认为这是由于一些不正确的估计。但是,我无法弄清楚错误估计的来源。下面显示的是更快的计划,由于 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

虽然我仍然不完全理解这里的执行计划向我们展示了什么,但事实证明,这个特定的问题实例可以通过在索引视图上指定 WITH (NOEXPAND) 来解决,强制优化器考虑索引视图上的索引(我认为它已经从执行计划中执行,但显然不是)。