SQL中的where子句的顺序是重要的

比方说,我有一个名为PEOPLE的表有3列ID, LastName, FirstName ,这些列都没有索引。
LastName更加独特, FirstName不那么唯一。

如果我做2个search:

 select * from PEOPLE where FirstName="F" and LastName="L" select * from PEOPLE where LastName="L" and FirstName="F" 

我的观点是第二个更快,因为更独特的标准( LastName )在where子句中首先出现,并且logging将被更有效地消除。 我不认为优化器是足够聪明的优化第一个SQL。

我的理解是正确的吗?

不,这个顺序无关紧要(或者至less:不应该)。

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

我知道SQL Server查询优化器会select一个合适的索引 – 不pipe哪个顺序你有两个条件。我假设其他RDBMS将有类似的策略。

重要的是你是否有合适的索引!

在SQL Server的情况下,如果您有以下情况,可能会使用索引:

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

另一方面 – 再次对于SQL Server – 如果使用SELECT *来获取表中的所有列,并且该表非常小,那么查询优化器很可能只是执行表(或聚簇索引)扫描使用一个索引(因为查find完整的数据页来获取所有其他列只是太快花费太贵)。

WHERE子句的顺序不应该在符合SQL标准的数据库中有所作为。 在大多数数据库中,评估的顺序是不能保证的。

不要以为SQL关心这个命令。 以下在SQL Server中生成一个错误:

 select * from INFORMATION_SCHEMA.TABLES where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0 

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

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

6.3.3.3规则评估顺序

如果优先顺序不是由格式或括号决定的,则expression式的有效评估通常从左到右进行。 但是,实现依赖于expression式是否实际上从左到右进行计算,特别是在操作数或运算符可能会导致条件被提出的情况下,或者如果可以在不完全评估expression式的所有部分的情况下确定expression式的结果。

从这里复制

不,所有RDBM首先通过分析查询并通过重新sortingwhere子句来优化它。

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

M.

原始的OP声明

我的观点是第二个更快,因为更独特的标准(LastName)首先进入where子句,并且logging将被更有效地消除。 我不认为优化器足够聪明,可以优化第一个sql。

我想你是混淆这与select列的顺序,同时创build索引,你必须首先select更多的列比第二select性等等。

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

这是真的,假设名称没有索引。 不同的数据会使它错误。 为了找出哪种方法可以做到这一点,每次都会有所不同,数据库pipe理系统将不得不为每一列运行一个不同的计数查询,并比较这些数字,这将花费的不仅仅是耸耸肩,而是继续前进。