TSQL, как оптимизатор справляется с соединениями с неиспользуемыми таблицами

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)


person JosephDoggie    schedule 10.04.2019    source источник


Ответы (1)


Да, оптимизатор запросов может пропустить таблицу 3, поскольку на нее нет ссылки в списке SELECT, а условие соединения — LEFT OUTER JOIN, поэтому фильтрация отсутствует.


Связано: 10 классных оптимизаций SQL, которые не зависят от модели затрат, Лукас Эдер:

  • Ненужный доступ к таблице
  • ПРИСОЕДИНЯЙСЯ к ликвидации

ПРИСОЕДИНЯЙТЕСЬ Исключение: важная функция оптимизатора для расширенного использования SQL

person Lukasz Szozda    schedule 10.04.2019
comment
Любые мысли по поводу: если это так, может ли он пропустить другие оптимизации для более сложных запросов, если таблица 3 не была удалена из запроса вручную? - person JosephDoggie; 11.04.2019
comment
@JosephDoggie Современные оптимизаторы запросов могут быть очень умными. Как правило, да, если вы видите, что некоторые условия невозможны/необходимы, вам следует удалить их вручную. - person Lukasz Szozda; 11.04.2019