У меня есть запрос, в котором я использую 13 LEFT OUTER JOINS. Самая левая таблица имеет большие данные, поэтому для выполнения запроса и возврата результата требуется очень много времени. Но когда я использую предложение where для фильтрации результата, это занимает очень мало времени. Теперь я запутался в том, что выполняется в первую очередь: объединения, которые производят результат, а затем, где от него фильтруется условие ИЛИ сначала он фильтрует результат, принимает соединение результата.
Который запускается первым: объединение или предложение where
Ответ 1
Как правило, любая СУБД (например, SQL) будет выполнять свою оптимизацию запросов, которая использует алгоритм, который, по его мнению, является самым быстрым. Поэтому он фильтрует, а затем присоединяется.
Ответ 2
Читайте: , который запускается первым при выполнении запроса WHERE CLAUSE илиJOIN CLAUSE?
и
Я пишу пост Pinal Dave, и я нашел это, это migh talso поможет вам понять
понимать предложение 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