【发布时间】:2016-02-25 12:22:02
【问题描述】:
在性能方面有什么区别,当有许多查询在 where 子句中使用(不同的)常量值运行时,与在顶部声明参数的查询相反,参数值在哪里发生变化?
where 子句中具有常量值的示例查询:
select
*
from [table]
where [guid_field] = '00000000-0000-0000-000000000000' --value changes
提出的(改进的?)带有声明参数的查询:
declare @var uniqueidentifier = '00000000-0000-0000-000000000000' --value changes
select
*
from [table]
where [guid_field] = @var
有什么不同吗?我正在查看类似于上述两个查询的执行计划,但没有发现任何区别。但是,我似乎记得,如果您在 SQL 语句中使用常量值,那么 SQL 服务器将不会重用相同的查询执行计划,或者会导致性能下降——但这真的是真的吗?
【问题讨论】:
-
SQL Server 的编译和存储查询的规则相当复杂。一般来说,我认为它会根据传入的第一个参数编译查询。因此,如果查询计划被缓存并且您更改了参数,那么该计划的后续使用对于新值可能不是最佳的。但是,对于生成查询计划的第一次调用应该没问题。注意:从空表开始然后填充表也会影响最佳计划,即使传入的值相同。
标签: sql sql-server sql-server-2012