Фильтры соединяются или где положения TSQL
-
16-10-2019 - |
Вопрос
Куда мне поставить фильтры на запрос TSQL?
SELECT a.colum FROM A
JOIN B ON A.ID = B.ID AND B.STATUS = 1
ИЛИ ЖЕ
SELECT a.colum FROM A
JOIN B ON A.ID = B.ID
WHERE B.STATUS = 1
Я ищу проблемы с производительностью или хорошую практику.
Решение
- Нет разницы в производительности
- Лучшая практика - явное соединение и отдельные фильтры (ваш 2 -й пример)
Примечание:
Это меняется для внешних соединений, потому что вы измените его на внутреннее соединение
Быстрый путь:
SELECT a.colum
FROM
A
LEFT JOIN
B ON A.ID = B.ID AND B.STATUS = 1
WHERE
a.foo = 'bar'
С отдельными фильтрами:
SELECT a.colum
FROM
A
LEFT JOIN
(SELECT * FROM B WHERE STATUS = 1) B ON A.ID = B.ID
WHERE
a.foo = 'bar'
Другие советы
Это зависит. Вам нужно посмотреть на план выполнения для ваших конкретных запросов и посмотреть, какой запрос использует более эффективный план. С такими простыми запросами, как ваш пример, планы, вероятно, будут выглядеть довольно похожими. Чем сложнее запрос, тем больше разницы вы увидите в плане.
Не связан с dba.stackexchange