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-машинами достаточно умными, чтобы сделать это таким образом?

Ответ 1

Нет, порядок предложений WHERE не имеет значения.

Оптимизатор рассматривает запрос и определяет наилучшие способы получения данных на основе индексов и т.д. Даже если бы был индекс покрытия в столбцах category_id и author, либо удовлетворял бы критериям его использования (при условии, что нет ничего лучшего).

Ответ 2

SQL declarative.

В вашем примере вы сказали движку/оптимизатору, что вы хотите... теперь он выработает лучший способ сделать это (в пределах разумного и "стоимостного", который будет несовместимым).

Ответ 3

В то время как вообще, нет, предполагается, что вы используете современную базу данных. Возможно, десять лет назад это, безусловно, имело значение.

Ответ 4

Короче говоря, нет, они не имеют значения, поскольку оптимизатор определит наилучшее средство для извлечения данных.

Ответ 5

Да, SQL является декларативным языком. Но в SQL Server (не уверен в других механизмах) администратор базы данных может (вроде) сделать это, форсируя план выполнения в хранилище запросов SQL.

enter image description here

Но, да, вы не можете управлять им из своего приложения или из самого текста запроса.

PS Еще 2 цента: вы можете контролировать порядок JOIN, используя FORCE ORDER.