【问题标题】:SQL - Does the order of WHERE conditions matter?SQL - WHERE 条件的顺序是否重要?
【发布时间】:2011-03-10 07:02:16
【问题描述】:

假设category_id 是表books 的索引键(不是主键)。下面两条SQL语句有区别吗?

SELECT * FROM books WHERE author='Bill' AND category_id=1

SELECT * FROM books WHERE category_id=1 AND author='Bill'

我猜先按category_id 过滤记录,然后按author 过滤比以相反顺序过滤记录要快。 SQL 引擎是否足够聪明,可以这样做吗?

【问题讨论】:

标签: sql


【解决方案1】:

不,WHERE 子句的顺序无关紧要。

优化器审查查询并根据索引等确定获取数据的最佳方式。即使 category_id 和 author 列上有覆盖索引 - 两者都满足使用它的标准(假设没有更好的东西)。

【讨论】:

  • 虽然我同意我要补充的一件事是我会订购你的逻辑,当使用 or 语句时会立即通过,或者在使用 and 语句时可能会立即失败。如果您可以立即找到,则无需检查其他标准。
  • 不是最新的统计数据会影响这个吗?
  • @Abe Miessler:是的,过时的统计信息和索引会对优化器的选择产生负面影响。但数据越多,更新这些数据的成本就越高。
  • MySQL 也一样吗?
  • @AndrewHeath:据我所知,这适用于数据库(没有 NoSQL 变体)
【解决方案2】:

SQL 是declarative。

在您的示例中,您已经告诉引擎/优化器您想要什么......现在它会找出最好的方法来做到这一点(在合理和“成本”范围内,这将是题外话)。

【讨论】:

  • +1 表示真实的陈述。也就是说,Prolog 是声明性的,但(至少在我使用的实现中)条件的顺序很重要。
【解决方案3】:

一般来说,不,这假设您使用的是现代数据库。也许在十年前,那肯定很重要。

【讨论】:

  • 是的。在制定执行计划时,Oracle 基于规则的优化器 (RBO) 似乎会查看 where 子句中谓词的顺序。
  • +1 表示较旧的 RDBMS 系统可能没有此功能。
【解决方案4】:

简而言之,不,它们无关紧要,因为优化器将确定获取数据的最佳方式。

【讨论】:

    【解决方案5】:

    是的,SQL 是一种声明性语言。但是在 SQL Server(不确定其他引擎)中,DBA 实际上(有点)可以通过在 SQL 查询存储中强制执行计划来做到这一点。

    但是,是的,您无法从应用程序或查询文本本身控制它。

    附: 2 美分:您可以使用FORCE ORDER 控制 JOIN 的顺序。

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多