SQL-WHERE条件的顺序重要吗?


74

假设这category_id是table的索引键(不是主键)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引擎足够聪明地做到这一点吗?


1
发布之前我已经搜索过。有人知道如何编辑此帖子,以便以后其他人遇到相同问题时更容易被搜索出来吗?
Powerboy 2010年

@OMG _ Remus Rusanu最近在一个问题上发布了此链接。也许是那样吗?rusanu.com/2009/09/13/...
马丁·史密斯

@马丁史密斯:不知道雷木思有一个博客,非常酷。找到了博客链接发布位置的链接?
OMG Ponies,2010年


Answers:


70

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

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


尽管我确实同意我要补充的一件事是,我将命令您的逻辑在使用or语句时立即通过,或者在使用and语句时立即失败。如果您可以立即查找,则无需检查其他条件。
spinon 2010年

最新的统计信息会影响此吗?
安倍·米斯勒

1
@Abe Miessler:是的,统计信息和索引过时会对优化器选择的内容产生负面影响。但是,数据越多,更新这些数据的成本就越高。
OMG小马

MySQL是否也是如此?
德鲁

1
@AndrewHeath:据我所知,这适用于数据库(缺少NoSQL变体)
OMG Ponies

10

SQL是声明性的

在您的示例中,您已经告诉引擎/优化器您想要什么...它现在将成为实现此目标的最佳方法(在合理的范围内,“成本”将不在主题之内)。


6
+1为真实陈述。就是说,Prolog是声明性的,但是(至少对于我使用的实现而言)条件的顺序很重要。
贾斯汀·K 2010年

5

通常,不,这假设您使用的是现代数据库。也许十年前,那当然很重要。


是。甲骨文基于规则的优化器(RBO)似乎在制定执行计划时会在where子句中查看谓词的顺序。
Shannon Severance 2010年

3
+1表示较旧的RDBMS系统可能不具有此功能。
nuzzolilo 2014年

2

简而言之,不重要,因为优化程序将确定获取数据的最佳方法。


1

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

在此处输入图片说明

但是,是的,您无法从您的应用或在查询文本本身中进行控制。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.