我有一个在 where 子句中指定值时运行速度快(
SELECT *
FROM vwPayments
WHERE AccountId = 8155
...但是当该值是变量时运行缓慢(~3s):
DECLARE @AccountId BIGINT = 8155
SELECT *
FROM vwPayments
WHERE AccountId = @AccountId
为什么第二个查询的执行计划不同?为什么运行速度这么慢?
在第一种情况下,编译语句时参数值是已知的。优化器使用统计直方图为该特定参数值生成最佳计划。
当您定义局部变量时,SQL Server无法使用参数值来查找“最佳值”。由于参数值在编译时未知,因此优化器根据“均匀分布”计算估计行数。优化器提出了一个对于任何可能的输入参数值都“足够好”的计划。
另一篇有趣的文章几乎完全描述了您的情况,可以找到here http://www.sqlservercentral.com/blogs/practicalsqldba/2012/06/27/how-local-variable-or-optimize-for-unknown-resolve-parameter-sniffing/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)