T-SQL - почему INNER MERGE JOIN делает несколько соединений определенными, чтобы они выполнялись быстрее
Я очень смущен по этому поводу. Я не могу привести пример, потому что окончательный оператор SQL создается динамически, и многие функции и процедуры играют в этом роль...
Как правило, у меня есть пять объединений. Я заметил, что когда я удаляю один из них, оператор выполняется в течение 0 секунд, в противном случае более 4 минут. Затем я изучил фактический план выполнения и заметил, что "объединение слиянием" требует больших затрат. Поиск в Google оставляет меня с "INNER MERGE JOIN" с помощью или "OPTION (MERGE JOIN)" и концом оператора.
Это было действительно хорошо, потому что запрос теперь выполняется в течение 0 секунд. Но мой вопрос почему?
Я провел небольшое исследование и вижу, что для использования MERGE join два оператора должны быть отсортированы - это не мой случай, это не так, и я все равно получаю правильный результат через 0 секунд.
Кто-нибудь продвинулся в идее T-SQL, почему это может быть вызвано?
Я знаю, что у меня уже есть решение, но я хочу знать, почему это работает и что происходит.
2 ответа
Одна из причин, почему это может произойти, заключается в том, что в медленном плане он использует объединение вложенных циклов с дорогим для оценки запроса на внутренней стороне (план выбран из-за неточных оценок стоимости)
Предоставление подсказки объединения слиянием приведет к тому, что дорогой запрос будет оцениваться только один раз (как входные данные для оператора сортировки из вашего описания), а не многократно (объединение слиянием выполняет один проход через каждый из своих входных данных).
Вам нужно будет записать планы выполнения для медленных и быстрых версий, чтобы увидеть, так ли это.
Оптимизатор запросов учитывает количество соединений при составлении плана. Я видел тот же самый сценарий, где при 5 соединениях требуется другой подход. Вы можете использовать табличные подсказки, чтобы форсировать план запроса. Вы также можете заново создать запрос, чтобы использовать объединение или пересечение, а не соединение.