Наиболее оптимальный порядок (объединений) для левого объединения - PullRequest
3 голосов
/ 11 июня 2010

У меня есть 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 объединения слиянием для обоих объединений. Для первого запроса первое слияние происходит с T1 и T2, а затем с T3. Для второго запроса первое слияние происходит с T1 и T3, а затем с T2.

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

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

Ответы [ 3 ]

3 голосов
/ 11 июня 2010

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

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

Я бы не ожидал, что этот запрос займет 40 секунд.Возможно, вы не определили правильные индексы.Вы должны использовать такие инструменты, как SQL Server Profiler или Советник по настройке ядра СУБД SQL Server , чтобы посмотреть, может ли он порекомендовать какие-либо новые индексы.

2 голосов
/ 11 июня 2010

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

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

1 голос
/ 11 июня 2010

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

...