T / SQL效率和执行顺序

时间:2010-04-09 13:06:02

标签: sql performance tsql sql-execution-plan

关于SQL中语句的执行顺序,下面的表现是否有任何区别?

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

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

如果有任何差异,是否可能有一个链接等,你可以在哪里可以了解更多相关信息?

非常感谢,

凯尔

7 个答案:

答案 0 :(得分:4)

优化器,因为它使用基于成本的优化器,将决定哪条“路由”最佳:它将根据统计数据花费选项,然后从那里开始。术语的顺序应该没有区别(虽然你如何嵌套东西,可能会产生影响)。

编辑:Oracle曾经 - 直到最近 - 一个基于规则的优化器(RBO),但has now been phased out。由于RBO无法解决统计问题,因此可以根据谓词的顺序查看查询计划的差异。

答案 1 :(得分:2)

没有区别。您可以在SQL Server中提取查询,然后单击“显示估计执行计划”图标并检查两个查询的执行计划。它们应该完全相同。

答案 2 :(得分:1)

优化器可以自由地重新排列并执行最常见的谓词 检索数据的效率/成本效益。

Does the order of criteria the WHERE clause matter?

答案 3 :(得分:1)

我将添加以下link

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

但是,应该注意的是规划人员并不完美,而且他们只估算成本,因此在某些情况下(让您了解查询规划人员的详细信息限制),您可以重写查询条件以帮助规划师看到了更好的道路。

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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