T-SQL从视图中选择变量慢得多

Dom*_*nic 6 t-sql sql-server

我有一个在where子句中指定值时运行速度快(<1s)的视图:

SELECT *
FROM vwPayments
WHERE AccountId = 8155
Run Code Online (Sandbox Code Playgroud)

第一次查询的执行计划

...但是当该值是变量时运行缓慢(~3s):

DECLARE @AccountId BIGINT = 8155

SELECT *
FROM vwPayments
WHERE AccountId = @AccountId
Run Code Online (Sandbox Code Playgroud)

第二次查询的执行计划

为什么第二个查询的执行计划不同?为什么它运行得这么慢?

RTh*_*mas 2

简而言之,当该值是已知值时,查询优化器用来选择最佳计划的统计分析会选择一个搜索,而当该值未知时,它可以利用统计数据和扫描。它在第二个选择中选择扫描,因为该计划是在知道 where 子句的值之前编译的。

虽然我很少建议在这种特定情况下使用查询分析器,但您可以使用Forceseek提示或其他查询提示来覆盖引擎。但请注意,在引擎的帮助下找到一种获得最佳计划的方法是一个更好的解决方案。

我快速谷歌了一下,发现了一篇不错的文章,更深入地探讨了局部变量影响查询计划的概念。