Который запускается первым: объединение или предложение where

У меня есть запрос, в котором я использую 13 LEFT OUTER JOINS. Самая левая таблица имеет большие данные, поэтому для выполнения запроса и возврата результата требуется очень много времени. Но когда я использую предложение where для фильтрации результата, это занимает очень мало времени. Теперь я запутался в том, что выполняется в первую очередь: объединения, которые производят результат, а затем, где от него фильтруется условие ИЛИ сначала он фильтрует результат, принимает соединение результата.

Ответ 1

Как правило, любая СУБД (например, SQL) будет выполнять свою оптимизацию запросов, которая использует алгоритм, который, по его мнению, является самым быстрым. Поэтому он фильтрует, а затем присоединяется.

Ответ 2

Читайте: , который запускается первым при выполнении запроса WHERE CLAUSE илиJOIN CLAUSE?

и

Я пишу пост Pinal Dave, и я нашел это, это migh talso поможет вам понять

SQL SERVER - Интересное наблюдение ON-предложения в LEFT JOIN - как ON-предложение влияет на набор результатов в LEFT JOIN

enter image description here

enter image description here

понимать предложение ON, которое применяется перед JOIN, поэтому он извлекает весь результат таблицы2, где есть флаг = 1, но он не влияет на таблицу 1, поэтому он извлекает все строки таблицы1. Когда применяется предложение WHERE, оно применяется к полному результату, поэтому оно удаляет все строки из Таблицы 1 и Таблицы 2, где Флаг не равен 1, по существу сохраняя флаг = 1 строки из Таблицы 1 и Таблицы 2.

Ответ 3

Скопировано из моего предыдущего ответа

create table A(id int);
create table B(id int);

INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);

INSERT INTO B VALUES(1);
INSERT INTO B VALUES(2);
INSERT INTO B VALUES(3);

SELECT * FROM A;
SELECT * FROM B;

id
-----------
1
2
3

id
-----------
1
2
3

Фильтр в JOIN для предотвращения добавления строк во время процесса JOIN.

select a.*,b.*
from   A a left join B b 
on     a.id =b.id and a.id=2;

id          id
----------- -----------
1           NULL
2           2
3           NULL

WHERE будет фильтроваться после того, как произошел JOIN.

select a.*,b.* 
from   A a left join B b 
on     a.id =b.id 
where  a.id=2;

id          id
----------- -----------
2           2