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
.