关于SQL中语句的执行顺序,下面的表现是否有任何区别?
SELECT * FROM Persons
WHERE UserType = 'Manager' AND LastName IN ('Hansen','Pettersen')
和
SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen') AND UserType = 'Manager'
如果有任何差异,是否可能有一个链接等,你可以在哪里可以了解更多相关信息?
非常感谢,
凯尔
答案 0 :(得分:4)
优化器,因为它使用基于成本的优化器,将决定哪条“路由”最佳:它将根据统计数据花费选项,然后从那里开始。术语的顺序应该没有区别(虽然你如何嵌套东西,可能会产生影响)。
编辑:Oracle曾经 - 直到最近 - 一个基于规则的优化器(RBO),但has now been phased out。由于RBO无法解决统计问题,因此可以根据谓词的顺序查看查询计划的差异。
答案 1 :(得分:2)
没有区别。您可以在SQL Server中提取查询,然后单击“显示估计执行计划”图标并检查两个查询的执行计划。它们应该完全相同。
答案 2 :(得分:1)
优化器可以自由地重新排列并执行最常见的谓词 检索数据的效率/成本效益。
答案 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))子句。