Обычное соединение против соединения с подзапросами - PullRequest
0 голосов
/ 05 августа 2020

Как лучше всего выполнять запросы с объединениями?

  1. Сначала объедините таблицы, а затем добавьте условия where
  2. Сначала добавьте условия where с подзапросом, а затем присоединитесь

Например, какой из следующих запросов имеет лучшую производительность?

select * from person persons
         inner join role roles on roles.person_id_fk = persons.id_pk 
         where roles.deleted is null

или

select * from person persons
         inner join (select * from role roles where roles.deleted is null) as roles
         on roles.person_id_fk = persons.id_pk 
         

1 Ответ

1 голос
/ 05 августа 2020

В хорошей базе данных не должно быть разницы между двумя запросами. Помните, что SQL - это описательный язык, а не процедурный язык. То есть оператор SQL SELECT описывает набор результатов, который должен быть возвращен. В нем не указаны шаги для его создания.

Ваши два запроса семантически эквивалентны, и оптимизатор SQL должен уметь это распознавать.

Конечно, оптимизаторы SQL не всеведущий. Итак, иногда то, как вы пишете запрос , влияет на план выполнения. Однако запросы, которые вы описываете, превращаются в планы выполнения, которые не имеют понятия «подзапрос», поэтому разумно, что они будут производить тот же план выполнения.

Примечание. Некоторые базы данных, такие как MySQL и MS Access - не имеют очень хороших оптимизаторов, и такие запросы действительно создают разные планы выполнения. Увы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...