Наиболее оптимальный порядок (соединений) для левого соединения


У меня есть 3 таблицы Table1 (с 1020690 записями), Table2(с 289425 записями), Table 3(с 83692 записями).У меня есть что-то вроде этого

SELECT * FROM Table1 T1 /* OK fine select * is bad when not all columns are needed, this is just an example*/
LEFT JOIN Table2 T2 ON T1.id=T2.id
LEFT JOIN Table3 T3 ON T1.id=T3.id

И такой запрос

SELECT * FROM Table1 T1
LEFT JOIN Table3 T3 ON T1.id=T3.id
LEFT JOIN Table2 T2 ON T1.id=T2.id

План запроса показывает мне, что он использует 2 Merge Join для обоих соединений. Для первого запроса первое слияние выполняется с T1 и T2, а затем с T3. Для второго запроса первое слияние выполняется с T1 и T3, а затем с T2.

Оба эти запроса занимают примерно одинаковое время (около 40 секунд).) или иногда Query1 занимает на пару секунд больше времени.

Итак, мой вопрос заключается в том, имеет ли значение порядок соединения ?

3 3

3 ответа:

Порядок соединения для такого простого запроса не должен иметь значения. Если есть способ изменить порядок соединений для повышения производительности, это задача оптимизатора запросов.

Теоретически, вы не должны беспокоиться об этом-в этом смысл SQL. Попытка перехитрить оптимизатор запросов обычно не дает лучших результатов. Особенно в MS SQL Server, который имеет очень хороший оптимизатор запросов.

Я бы не ожидал, что этот запрос займет 40 секунд. Возможно, ты не имеешь на это права. определены индексы. Вы должны использовать такие инструменты, как SQL Server Profiler или SQL Server Database Engine Tuning Advisor, чтобы узнать, может ли он рекомендовать какие-либо новые индексы.

Оптимизатор запросов будет использовать комбинацию ограничений, индексов и статистики, собранных в таблице, для построения плана выполнения. В большинстве случаев это работает хорошо. Однако я иногда сталкиваюсь со сценариями, в которых план выполнения выбран неудачно. Часто настройка запроса может эффективно принудить оптимизатора к выбору лучшего плана. Однако я не могу предложить никаких общих правил для этого. Когда все остальное терпит неудачу, вы можете прибегнуть к FORCE ORDER запрос Подсказка .

И да, порядок соединения может оказать значительное влияние на время выполнения вашего запроса. Идея заключается в том, что при соединении таблиц, которые дают наименьшие результаты сначала, следующее соединение будет вычисляться быстрее. Однако важно отметить, что при отсутствии FORCE ORDER и при прочих равных условиях порядок, указанный в запросе, может не иметь корреляции с тем, как оптимизатор строит план выполнения.

В целом SQL Server достаточно умен, чтобы выбрать лучший способ объединения, и он будет использовать не только порядок, который вы написали в запросе. Тем не менее, мне легче понять сложный запрос, если сначала все внутренние соединения, а затем левые соединения.