为什么语句对T-SQL的顺序很重要?

时间:2012-10-10 14:27:45

标签: sql sql-server tsql optimization ssms

为什么在打开如下所示的查询时:

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

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

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

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

是否有一个关于最终优化的最佳语句顺序的一般规则?

运行我自己的测试后,第二个查询会在处理时间内缩短0.5毫秒。它很小,我知道,但随着查询的复杂性会增加(仍然几乎没有差别),我对SQL服务器的工作方式有一般的兴趣。

3 个答案:

答案 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将以最佳方式为您检索它。