为什么在打开如下所示的查询时:
WHERE (statement1) AND ((statement2) OR (statement3))
SSMS查询设计器是否将其重构为以下语法:
WHERE (statement1) AND (statement2) OR
(statement1) AND (statement3)
我认为它与SQL服务器如何解析查询,在ors之前运行等有关?
是否有一个关于最终优化的最佳语句顺序的一般规则?
运行我自己的测试后,第二个查询会在处理时间内缩短0.5毫秒。它很小,我知道,但随着查询的复杂性会增加(仍然几乎没有差别),我对SQL服务器的工作方式有一般的兴趣。
答案 0 :(得分:7)
它与实际的SQL执行无关。与您所知道的大多数语言不同,T-SQL does not have boolean operator short circuit 1 和诸如“在ors之前运行ands”之类的概念毫无意义,评估的顺序完全由查询优化器决策和may最终与你所写的完全不同,或者你的期望。
您看到的表达式重写似乎完全是SSMS查询设计内部解析器的工件。
1或者更好地说,无法通过编写表达式来强制确定布尔短路。实际运行时间操作员短路发生,你只是无法知道如果和 它将会发生。
答案 1 :(得分:2)
通常,无法保证SQL Server如何评估Where子句。优化器将始终尝试找到执行查询的最有效方法。
要确定执行顺序,您应该获得查询的执行计划(您可以通过SSMS获取)。但是,请记住,根据当前各种统计信息和资源的优化程序认为最佳查询,此计划可能会发生变化。
答案 2 :(得分:1)
在大多数情况下,您无需了解SQL如何优化查询以使其更好地执行。 SQL知道你没有的数据: - )
通常,您可以做的最好的事情是为SQL提供以最佳方式检索信息所需的索引。然后优化查询以便以最佳方式执行。
将此与正常编译器进行比较,这些编译器执行大量更改以优化代码。您通常可以做的最好的事情是编写可维护的代码,编译器将负责其余的工作。 SQL是一样的,了解您想要检索的内容,SQL将以最佳方式为您检索它。