Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么T-SQL语句的顺序很重要?_Sql_Sql Server_Tsql_Optimization_Ssms - Fatal编程技术网

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

为什么T-SQL语句的顺序很重要?,sql,sql-server,tsql,optimization,ssms,Sql,Sql Server,Tsql,Optimization,Ssms,为什么,当打开如下查询时: 其中(语句1)和((语句2)或(语句3)) SSMS查询设计器是否将其重构为以下语法: 其中(语句1)和(语句2)或 (声明1)和(声明3) 我假设这与SQLServer如何解析查询有关,在ors之前运行ands 是否有一个关于如何为最终优化选择最佳语句顺序的一般规则 运行了我自己的测试后,第二个查询缩短了0.5毫秒的处理时间。我知道它很小,但会随着查询的复杂性而增加(仍然几乎没有什么区别),我对SQL server的工作方式有着广泛的兴趣。一般来说,SQL serv

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

其中(语句1)和((语句2)或(语句3))

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

其中(语句1)和(语句2)或
(声明1)和(声明3)

我假设这与SQLServer如何解析查询有关,在ors之前运行ands

是否有一个关于如何为最终优化选择最佳语句顺序的一般规则


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

一般来说,SQL server对Where子句的求值方式没有保证。优化器将始终尝试找到执行查询的最有效方式


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

它与实际SQL执行无关。与您知道的大多数语言不同,T-SQL 1和“在ors之前运行ands”之类的概念毫无意义,计算顺序完全由查询优化器的决定决定决定,结果可能与您编写的或您期望的完全不同

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


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

在大多数情况下,您不必费心了解SQL是如何优化查询以使其性能更好的。SQL了解您的数据,但您不了解:-)

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


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

您如何运行计时测试?您是否多次运行查询?您是否运行了查询1,紧接着是查询2?如果是这样,您是否也按相反的顺序进行了尝试?我没有料到它们之间会有任何区别。我运行了更多的测试,它们似乎越不确定。为了衡量SQL执行情况,请使用和。不要使用经过的时间,这是没有用的。一旦SQL Server将数据缓存在内存中,后续查询可能会出现得更快。无论where语句的顺序如何,执行计划都是相同的(我假设这是因为SQL Server在幕后将它们重新排列为相同的)。@jaypeagi-所以我想你已经找到了答案。SQL Server查询计划生成器和优化器是非常智能的软件。而且,您构造查询的方式通常与引擎重写查询后所做的不一样。