SQL Сервер - неиспользованный LEFT JOIN влияет на план выполнения - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть такой запрос

SELECT TableA.Id FROM TableA
LEFT JOIN TableB ON TableA.Id = TableB.TableAId

В этом случае столбцы из таблицы B фактически не используются и не могут повлиять на результат, потому что это не INNER JOIN. Но план выполнения четко показывает, что он используется, и это влияет на производительность. Разве SQL Сервер не должен оптимизировать его, чтобы исключить неиспользуемые операции? Есть ли способ установить некоторые подсказки для выполнения или переписать запрос, чтобы использовать это объединение только тогда, когда оно действительно присутствует в предложении SELECT или WHERE?

К сожалению, я не могу просто удалить неиспользуемое объединение из запроса , В реальной жизни это более сложное представление, объединяющее множество таблиц, и оно всегда используется с другим списком SELECT или условием WHERE

1 Ответ

1 голос
/ 18 февраля 2020

LEFT JOIN может изменить результат, даже если их столбцы отсутствуют в наборе результатов.

Посмотрите, как эти два запроса возвращают разные результаты:

create table TableA (TableAId int)
create table TableB (TableBId int, TableAId int)

insert into TableA (TableAId) values (100), (200), (300)
insert into TableB (TableBId, TableAId) values (1, 100), (1, 200), (2, 100), (3, 300)

select TableA.TableAId 
from TableA

select TableA.TableAId 
from TableA
     left join TableB on TableB.TableAId = TableA.TableAId

Это потому, что если несколько строк сопоставьте условие объединения, тогда все строки будут объединены.

...