【问题标题】:Why does order of T-SQL where statements matter?为什么 T-SQL where 语句的顺序很重要?
【发布时间】:2012-10-01 01:41:09
【问题描述】:

为什么,当打开如下查询时:

WHERE (statement1) AND ((statement2) OR (statement3))

SSMS 查询设计器是否将其重构为以下语法:

WHERE (statement1) AND (statement2) OR (statement1) AND (statement3)

我认为这与 SQL 服务器如何解析查询有关,在 ors 之前运行 ands?

是否有关于如何以最佳语句顺序进行最终优化的一般规则?

运行我自己的测试后,第二个查询将处理时间缩短了 0.5 毫秒。我知道它很小,但会随着查询的复杂性而增加(仍然几乎没有区别),我对 SQL Server 的工作原理很感兴趣。

【问题讨论】:

  • 你是如何运行你的计时测试的?您是否多次运行查询?您是否运行了查询 1,紧接着是查询 2?如果是这样,您是否也以相反的顺序尝试它们?我没想到它们之间会有任何区别。
  • 我进行了更多测试,但我运行的次数越多,它们似乎就越没有结论。
  • 使用SET STATISTICS IO ONSET STATISTICS TIME ON来衡量SQL执行。不要使用经过的时间,那是没有用的。
  • 一旦 SQL Server 将数据缓存在内存中,后续查询可能会显得更快。

标签: sql sql-server tsql optimization ssms


【解决方案1】:

它与实际的 SQL 执行无关。与您知道的大多数语言不同,T-SQL does not have boolean operator short circuit1 和“在 ors 之前运行 ands”之类的概念没有意义,评估顺序完全由查询优化器决定驱动,最终可能与您所写的或您期望的完全不同。

您看到的表达式重写似乎完全是 SSMS 查询设计的内部解析器的产物。

1 或者更好地说,布尔短路不能通过你如何编写表达式来强制确定。实际运行时操作符短路确实会发生,你只是无法知道如果以及何时会发生。

【讨论】:

    【解决方案2】:

    通常,不能保证 SQL Server 如何评估 Where 子句。优化器将始终尝试找到最有效的方式来执行查询。

    要确定执行顺序,您应该获得查询的执行计划(您可以通过 SSMS 获得)。但是,请记住,在给定当前各种统计信息和资源的情况下,此计划可能会根据优化器认为的最佳查询而改变。

    【讨论】:

    • 无论 where 语句的顺序如何,执行计划都是相同的(我认为这是因为 SQL Server 在后台将它们重新排列为相同)。
    • @jaypeagi - 所以我猜你有你的答案。 SQL Server 查询计划生成器和优化器是非常智能的软件。而且,您构建查询的方式通常不会像引擎在重写后所做的那样。
    【解决方案3】:

    在大多数情况下,您不必费心去理解 SQL 如何优化查询以使其性能更好。 SQL 知道你不知道的关于你的数据的事情:-)

    通常,您能做的最好的事情就是为 SQL 提供以最佳方式检索信息所需的索引。然后优化查询以最佳方式执行。

    将此与执行大量更改以优化代码的普通编译器进行比较。您通常可以做的最好的事情是编写可维护的代码,编译器将负责其余的工作。 SQL 也一样,了解你要检索的内容,SQL 会以最优化的方式为你检索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-04
      • 2013-05-18
      • 1970-01-01
      • 2012-07-11
      • 2013-06-10
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多