在SQL中where子句的顺序重要吗?

在SQL中where子句的顺序重要吗?,sql,performance,where-clause,Sql,Performance,Where Clause,假设我有一个名为PEOPLE的表,有3列ID、LastName、FirstName,这些列都没有索引。 LastName更为独特,而FirstName则不那么独特 如果我进行2次搜索: select * from PEOPLE where FirstName="F" and LastName="L" select * from PEOPLE where LastName="L" and FirstName="F" 我认为第二个更快,因为更独特的标准(LastName)首先出现在where子句

假设我有一个名为
PEOPLE
的表,有3列
ID、LastName、FirstName
,这些列都没有索引。
LastName
更为独特,而
FirstName
则不那么独特

如果我进行2次搜索:

select * from PEOPLE where FirstName="F" and LastName="L" 
select * from PEOPLE where LastName="L" and FirstName="F"
我认为第二个更快,因为更独特的标准(
LastName
)首先出现在
where
子句中,记录将更有效地消除。我认为优化器不够聪明,无法优化第一个sql


我的理解正确吗?

不,顺序无关紧要(或者至少:应该无关紧要)

任何合适的查询优化器都会查看WHERE子句的所有部分,并找出满足该查询的最有效方法

我知道SQL Server查询优化器会选择一个合适的索引,无论您的两个条件是什么顺序。我假设其他RDBMS也会有类似的策略

重要的是你是否有一个合适的索引

对于SQL Server,如果您有以下情况,它可能会使用索引:

  • (LastName,FirstName)
  • (FirstName,LastName)
  • (LastName)
    ,或仅
    (FirstName)
    (或两者)上的索引

另一方面,同样对于SQL Server,如果使用
SELECT*
从表中获取所有列,并且表非常小,那么查询优化器很有可能只扫描表(或聚集索引),而不使用索引(因为查找完整数据页以获取所有其他列的成本太高了。)

不,所有RDBMs首先通过分析查询开始,然后通过重新排序where子句来优化查询

根据您使用的RDBM,可以显示分析结果(例如,在oracle中搜索解释计划)


M.

在符合SQL标准的数据库中,WHERE子句的顺序不应造成差异。在大多数数据库中,计算顺序不受保证

不要认为SQL关心顺序。以下内容在SQL Server中生成错误:

select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
选择*
来自信息\u SCHEMA.TABLES
其中ISNUMERIC(table_name)=1和CAST(table_name as int)0

如果先执行此子句的第一部分,则只有数字表名才会转换为整数。但是,它失败了,这提供了一个明确的示例,说明SQL Server(与其他数据库一样)不关心WHERE语句中子句的顺序。

假设名称未编入索引,则它是正确的。
不同的数据可能会导致错误。为了找出每次都不同的方法,DBMS必须对每一列运行不同的计数查询并比较数字,这将不仅仅是耸耸肩和继续操作的成本。

ANSI SQL Draft 2003 5WD-01-Framework-2003-09.pdf

6.3.3.3规则评估顺序

如果优先级不是由格式或括号确定的,则表达式的有效计算通常从左到右进行。但是,表达式是否从左到右进行计算取决于实现,特别是当操作数或运算符可能导致条件升高时,或者可以在不完全计算表达式的所有部分的情况下确定表达式

从原始OP语句中复制

我认为第二个更快,因为在where子句中,更唯一的条件(LastName)排在第一位,记录将被更有效地消除。我认为优化器没有>足够聪明来优化第一个sql

我猜你把这和在创建索引时选择列的顺序混淆了,在索引中,你必须将选择性更强的列放在第一位,而不是第二高选择性的列,依此类推


顺便说一句,对于上述两个查询,SQL server优化器不会进行任何优化,但只要计划的总成本小于并行阈值成本,就会使用Trivila计划。

不,顺序无关紧要-任何合适的查询优化器都会查看所有WHERE子句并找出最有效的方法来满足该查询WHAT w当你运行这两个语句时,你的观察结果是什么?执行计划是什么样子的?你指的是一个特定的RDBMS吗?确实存在差异。也可能是和的重复,它是基于索引的。因此,就内容而言,它是间接的。如果没有索引op可能是正确的,这取决于数据。当然,这样做没有索引,将是一个奇怪的决定…@TonyHopkinson:我不这么认为-即使没有索引,我也怀疑有任何区别。毕竟:没有索引,RDBMS除了完整的表扫描还能做什么,真的吗?SQL server的有趣的旁注,appare谓词中不存在的顺序实际上会影响计划的创建:奇怪的是,对于第一次执行查询,WHERE子句中的条件顺序确实很重要!我有两个条件,比如:
WHERE T1.col_1/T2.col_2>10和T2.col_2 0
,得到了一个
除以0
的错误查询成功执行的顺序和条件。然后我将顺序切换回来,希望再次出现错误,但这次成功了!最后,我的结论是,在第一次运行之前,顺序确实重要,直到执行计划建立。之后,顺序不再重要,因为优化器/执行计划会处理我完全同意你所说的,“……或者至少:应该不重要”——我完全同意。不幸的是,有时候它确实很重要。我见过SQL过于复杂,优化器无法处理的情况