Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Где эффективнее ставить фильтрующее условие при соединении таблиц?

#sql #oracle


Предположим, есть таблицы TABLE_1 и TABLE_2. Мы хотим их сджойнить. Но при этом,
мы мы знаем, что нет нужды джойнить всю таблицу TABLE_1, отсекая по дате нужные строки
(может даже индекс есть на столбце с датой). Так вот. У нас есть два варианта джойна:

SELECT * FROM TABLE_1 T1
  JOIN TABLE_2 T2 ON T1.COL_1 = T2.COL_1
WHERE T1.COL_DATE between to_date(...) and to_date(...);


И другой вариант

SELECT * FROM TABLE_1 T1
  JOIN TABLE_2 T2 ON T1.COL_DATE between to_date(...) and to_date(...)
    AND T1.COL_1 = T2.COL_1;


Какой вариант эффективнее и по какой логике? Или вообще без разницы и запрос будет
оптимизирован автоматически?
    


Ответы

Ответ 1



Если речь идет о INNER JOIN, что эквивалентно просто JOIN, то запросы вернут одинаковый результат, но первый вариант лично мне кажется более понятным. Исходные таблицы: SQL> select * from a; ID COL1 ---------- ---------- 1 11 2 12 3 13 3 rows selected. SQL> select * from b; ID COL2 ---------- ---------- 1 111 3 333 5 555 3 rows selected. Пример для INNER JOIN: SELECT * FROM a t1 JOIN b t2 ON t1.id = t2.id 4 WHERE t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 1 row selected. SELECT * FROM a t1 3 JOIN b t2 ON t1.id = t2.id AND t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 1 row selected. Для LEFT OUTER JOIN логика меняется потому что предикат WHERE будет исполнен уже после объединения, а в объединение (до фильтрования - применения предиката WHERE) попадут все строки из левой таблицы. Пример для LEFT OUTER JOIN (синоним LEFT JOIN): SELECT * FROM a t1 LEFT JOIN b t2 ON t1.id = t2.id WHERE t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 2 12 2 rows selected. SELECT * FROM a t1 3 LEFT JOIN b t2 ON t1.id = t2.id AND t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 1 11 2 12 3 rows selected.

Комментариев нет:

Отправить комментарий