5

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

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

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

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

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

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

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

4

3 回答 3

7

它与实际的 SQL 执行无关。与您所知道的大多数语言不同,T-SQL没有布尔运算符短路1,并且诸如“在 ors 之前运行 ands”之类的概念没有意义,评估顺序完全由查询优化器决定驱动,最终可能完全不同从你写的,或者你期望的。

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

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

于 2012-10-10T14:34:35.727 回答
2

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

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

于 2012-10-10T14:31:13.500 回答
1

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

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

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

于 2012-10-10T14:35:42.837 回答