6

关于 SQL 中语句的执行顺序,以下性能方面有什么区别?

SELECT * FROM Persons
WHERE UserType = 'Manager' AND LastName IN ('Hansen','Pettersen')

和:

SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen') AND UserType = 'Manager'

如果有任何区别,是否可能有链接等,您可以在其中了解更多信息?

万分感谢,

凯尔

4

7 回答 7

4

优化器,因为它使用基于成本的优化器,将决定哪个“路线”是最好的:它将根据统计数据对选项进行成本,然后从那里开始。术语的顺序应该没有区别(尽管你如何嵌套事物,可能会有所不同)。

编辑:Oracle 曾经拥有 - 直到最近 - 基于规则的优化器 (RBO),但现在已被淘汰。由于 RBO 不使用统计信息,因此可以根据谓词的顺序看到查询计划的差异。

于 2010-04-09T13:08:56.327 回答
2

不会有任何区别。您可以在 SQL Server 中提取查询并单击“显示估计执行计划”图标并检查两个查询的执行计划。它们应该是相同的。

于 2010-04-09T13:12:59.463 回答
1

优化器可以自由地重新排列和执行谓词,因为它发现检索数据最有效/最具成本效益。

WHERE 子句的标准顺序是否重要?

于 2010-04-09T13:14:00.160 回答
1

我将添加以下链接

查询计划是根据所涉及的表和索引的统计信息选择的(给定需要执行的操作)。选择的查询执行计划是否最好取决于很多因素 - 但您的问题的答案是 MS SQL 无论如何都会产生相同的计划(它将考虑所有三个条件的最佳顺序并最终找到相同的结果)。

但是,应该注意,规划器并不完美,它们只估计成本,因此在某些情况下(如果您详细了解查询规划器的限制),您可能能够重写查询条件以帮助规划器查看更好的路径。

这(如果可能的话)应该只对被证明是关键的查询进行尝试,并且还要注意,当数据统计信息发生变化时,这种优化可能会减慢速度。

此外,在大多数情况下,有更好的方法(更改索引)来优化查询,这应该留给查询计划者。

RDBMS 的要点之一是指定如何检索数据(查询的声明性性质)——在大多数情况下,今天的查询计划人员会为您找到一个好的计划。

于 2010-04-09T14:09:25.403 回答
0

在所有主要的 sql 数据库中,没有区别

于 2010-04-09T13:08:30.627 回答
0

完全没有区别。两者都会产生相同的执行计划。

于 2010-04-09T13:09:04.997 回答
0

在 SQL Server 2000 中存在差异。我为此感到头疼。显然,它按照定义的顺序评估 where 子句。要指定是否希望通过索引过滤数据,我必须在 FROM 语句之后添加 WITH(INDEX(MY_INDEX_NAME1,MY_INDEX_NAME2)) 子句。

于 2010-04-09T21:37:49.150 回答