SQL - 使用常量值与参数有任何性能差异吗?

标签 sql sql-server sql-server-2012

当在 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 Server 将不会重用相同的查询执行计划,或者会导致性能更差 - 但实际上是这样吗?

最佳答案

这里区分参数和变量很重要。参数被传递给过程和函数,变量被声明。

解决问题中的 SQL 所具有的变量问题,在编译临时批处理时,SQL Server 会在其自己的权限内编译每个语句。 因此,当使用变量编译查询时,它不会返回检查任何赋值,因此它将编译针对未知变量优化的执行计划。 第一次运行时,此执行计划将被添加到计划缓存中,然后将来的执行可以并将此缓存重用于所有变量值。

当您传递常量时,查询将根据该特定值进行编译,因此可以创建更优化的计划,但会增加重新编译的成本。

因此,具体回答您的问题:

However, I seem to recall that if you use constant values in SQL statements that SQL server won't reuse the same query execution plans, or something to that effect that causes worse performance -- but is that actually true?

是的,同一计划确实不能重复用于不同的常量值,但这并不一定会导致性能变差。对于该特定常量,可能可以使用更合适的计划(例如,对于稀疏数据,选择书签查找而不是索引扫描),并且此查询计划更改可能会超过重新编译的成本。关于 SQL 性能问题几乎总是如此。答案是这取决于

对于参数,默认行为是根据首次执行过程或函数时使用的参数的时间来编译执行计划。

我之前已经通过示例更详细地回答了类似的问题,这些示例涵盖了上述内容,因此我不会重复其各个方面,而是仅链接问题:

关于SQL - 使用常量值与参数有任何性能差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35627172/

相关文章:

sql - 在 postgres 中实现用户定义的 c 函数

sql - 使用 SQL 查询进行轮盘赌选择

sql - GROUP BY ROLLUP 生成不必要的行

sql-server - 我的任务是维护 ITEMS 库存

xml - 获取xml元素在SQL Server 2012中的位置

php - MYSQL 返回总结果

python - ODOO 10 多对多

sql-server - 不想问但是这个脚本是否在 SQL Server 2008 上运行

sql - 如何在 sql server 中为该查询分配列标题/名称?

sql - 如何使用插入选择语句插入下一个最大值