代码之家  ›  专栏  ›  技术社区  ›  Ryu

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

  •  4
  • Ryu  · 技术社区  · 16 年前

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

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

    3 回复  |  直到 16 年前
        1
  •  3
  •   Matt Rogish    16 年前

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

    http://www.microsoft.com/technet/prodtechnol/sql/2005/qrystats.mspx

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

    如果在查询中使用局部变量 谓词而不是参数或 从字面上讲,优化器会采用 降低质量估计或猜测 因为谓语的选择性。使用 查询中的参数或文字 而不是局部变量,以及 优化器通常能够 选择一个更好的查询计划。例如, 考虑使用本地 变量:

        2
  •  1
  •   tvanfosson    16 年前

    我不知道这是否总是正确的,但使用一个在执行时间之前无法计算的变量将限制优化器在做出优化决策时使用它收集的关于表的任何统计数据的能力。引用的文章讨论了这一点,并给出了一些提示,说明如何在无法避免的情况下帮助SQL Server做出优化决策。

    裁判: http://www.sqlmag.com/Article/ArticleID/42801/sql_server_42801.html

        3
  •  1
  •   JoshBerke    16 年前

    如果使用文字,SQL Server可以构建更好的执行计划。我看到的一个案例涉及党派观点。如果您从带有变量的分区视图中进行选择,SQL将在运行时评估该变量,就像您使用文字SQL直接在底层表之后一样。

    话虽如此,你应该在硬编码之前进行测试,如果你有两个查询只在字面上有所不同,那将是一种气味。