我只是阅读我公司的代码指南,它说永远不会将变量视为sql server中的常量,而是使用文字。原因是当您在查询中使用变量时,sql server无法构建良好的执行计划。
有人知道这是否仍然存在?我们正在使用MSSQL 2005,这个文档可能是为2000年编写的。
答案 0 :(得分:3)
这对于SQL Server 2005来说“通常”是正确的,因为它现在尝试为尽可能多的查询预先生成执行计划。您的里程可能会有所不同,因为它取决于您的数据和您的SARG(测试您的查询计划并查看),但此tecdoc(他们使用的是预发布版本的SQL Server 2005)声明:
http://www.microsoft.com/technet/prodtechnol/sql/2005/qrystats.mspx
避免使用局部变量 查询
如果在查询中使用局部变量 谓词而不是参数或 从字面上看,优化器可以使用 降低质量估计或猜测 用于谓词的选择性。使用 查询中的参数或文字 而不是局部变量,和 优化器通常能够 选择一个更好的查询计划。例如, 考虑使用本地的此查询 变量:
答案 1 :(得分:1)
我不知道这是否总是如此,但使用一个在执行时间之前无法评估的变量将限制优化器在做出优化决策时使用它收集的有关表的任何统计信息的能力。引用的文章对此进行了讨论,并提供了一些有关如何帮助SQL Server在无法避免的情况下做出优化决策的提示。
参考:http://www.sqlmag.com/Article/ArticleID/42801/sql_server_42801.html
答案 2 :(得分:1)
如果SQL Server使用文字,则可以构建更好的执行计划。我看到的一个案例涉及一个分区视图。如果从带有变量的分区视图中选择SQL,则会在运行时评估该变量,就像使用文字SQL紧跟在基础表之后一样。
有了这个说你应该在硬编码之前测试,如果你有两个只有文字不同的查询那么那就是气味。