SQL - WHERE条件的顺序是否重要?

时间:2010-06-30 18:22:01

标签: sql

假设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引擎是否足够智能以这种方式实现?

5 个答案:

答案 0 :(得分:37)

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

优化程序会查看查询&确定基于索引等获取数据的最佳方法。即使category_id和author列上有覆盖索引 - 要么满足使用它的条件(假设没有更好的东西)。

答案 1 :(得分:9)

SQL是declarative

在你的例子中,你已经告诉了引擎/优化器你想要什么......现在它将找到最好的方法(在合理范围内和“成本”,这将是主题)。

答案 2 :(得分:4)

而一般而言,不,假设您使用的是现代数据库。也许十年前,它当然很重要。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

是的,SQL是一种声明性语言。但是在 SQL Server (不确定其他引擎)中,DBA可以通过强制执行SQL Query Store中的执行计划来(确实)执行此操作。

enter image description here

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

P.S。再加2美分:您可以使用Castle.Core来控制JOIN的顺序。