TSQL - как оптимизатор справляется с соединениями с неиспользуемыми таблицами
SELECT table1.col1, table2.col1, table2.col2 -- etc.
FROM dbo.table1
LEFT JOIN dbo.table2
on (table1.id = table2.id)
LEFT JOIN dbo.table3
on (table1.id = table3.id)
В приведенном выше простом примере очевидно, что таблица 3 не нужна, однако могут быть и более сложные случаи.
Вопрос: Может ли оптимизатор запросов TSQL определить, что JOIN с таблицей 3 не нужен? Если да, может ли он пропустить другие оптимизации для более сложных запросов, если таблица 3 не была удалена из запроса вручную?
Я использую SSMS 14.017 с базовой базой данных SQL select @@version = Microsoft SQL Server 2014 (SP3)
Да, оптимизатор запросов может пропустить таблицу 3, поскольку на нее нет ссылки в списке SELECT, а условие соединения — LEFT OUTER JOIN
, поэтому фильтрация отсутствует.
Связано: 10 крутых SQL-оптимизаций, которые не зависят от стоимостной модели, Лукас Эдер:
Устранение JOIN: необходимая функция оптимизатора для расширенного использования SQL
@JosephDoggie Современные оптимизаторы запросов могут быть очень «умными». Как правило, да, если вы видите, что некоторые условия невозможны/необходимы, вам следует удалить их вручную.
Любые мысли по поводу: если это так, может ли он пропустить другие оптимизации для более сложных запросов, если таблица 3 не была удалена из запроса вручную?