Sql server TSQL常量。。。使用变量还是文字?

Sql server TSQL常量。。。使用变量还是文字?,sql-server,tsql,Sql Server,Tsql,我正在阅读我公司的代码指南,它说在sql server中永远不要将变量当作常量,而是使用文本。原因是,当您在查询中使用变量时,sql server无法构建良好的执行计划 有人知道这是否仍然是真的吗?我们使用的是MSSQL 2005,本文档可能是为2000年编写的。我不知道这是否总是正确的,但是使用一个直到执行时才能计算的变量将限制优化器在做出优化决策时使用它收集的关于表的任何统计信息的能力。引用的文章对此进行了讨论,并提供了一些技巧,说明如何在无法避免的情况下帮助SQLServer做出优化决策

我正在阅读我公司的代码指南,它说在sql server中永远不要将变量当作常量,而是使用文本。原因是,当您在查询中使用变量时,sql server无法构建良好的执行计划


有人知道这是否仍然是真的吗?我们使用的是MSSQL 2005,本文档可能是为2000年编写的。

我不知道这是否总是正确的,但是使用一个直到执行时才能计算的变量将限制优化器在做出优化决策时使用它收集的关于表的任何统计信息的能力。引用的文章对此进行了讨论,并提供了一些技巧,说明如何在无法避免的情况下帮助SQLServer做出优化决策


Ref:

如果使用文本,SQL Server可以构建更好的执行计划。我看到的一个案例涉及到党派观点。如果使用变量从分区视图中进行选择,SQL将在运行时对变量进行求值,就好像您使用的文字SQL正好位于基础表之后

也就是说,您应该在硬编码之前进行测试,如果您有两个仅在文字上不同的查询,那么这将是一种气味

对于SQL Server 2005来说,这“通常”是正确的,因为它现在尝试为尽可能多的查询预生成执行计划。您的里程数可能会有所不同,因为这取决于您的数据和您的SARG(测试您的查询计划并查看),但此tecdoc(他们使用的是SQL Server 2005的预发布版本)指出:

避免在应用程序中使用局部变量 询问

如果在查询中使用局部变量 谓词而不是参数或 文本,优化器求助于 减少质量评估,或猜测 对于谓词的选择性。使用 查询中的参数或文本 而不是局部变量 优化器通常能够 选择一个更好的查询计划。例如 考虑使用本地的查询 变量: