为什么基于陈旧统计数据生成的执行计划的成本比基于更新统计数据的计划成本便宜?
要了解我的问题,请遵循以下方案:
假设:自动统计信息更新已关闭。
当我手动更新统计数据时,我执行了以下批处理,包括实际执行计划:
CHECKPOINT;
DBCC DROPCLEANBUFFERS;
SELECT *
FROM AWSales -- table has 60000 rows
WHERE SalesOrderID = 44133
OPTION(RECOMPILE);
--returns 17 rows
优化器生成了一个使用非聚集索引查找和键查找的计划 - 这绝对没问题。
然后我想欺骗优化器,所以我插入了60 000行,其中SalesOrderID列的输入值为44133.
在没有更新统计信息的情况下,我再次执行了上述批处理,并且优化器返回了相同的计划(使用索引搜索),但当然还有不同的成本(返回60 000行)。
接下来,我使用手动全扫描更新统计信息,然后再次执行批处理。这次优化器使用索引扫描运算符返回了不同的计划。可预测的。乍一看它看起来不错。但是,当我比较查询计划成本时,它比使用索引查找的计划成本更昂贵。因此,在更新统计信息后,使用最佳计废话! 然后我想比较更新前和更新后索引搜索的成本。更新的统计信息导致优化器选择了带索引扫描的计划,因此要强制生成带索引搜索的计划,我在查询中添加了提示。执行后发现,实际的查询成本(强制索引扫描)比统计过时的成本要大得多。怎么可能?
有关详细信息,请查看示例script