Советы по SQL Server 2008 JOIN
Недавно я пытался оптимизировать этот запрос
UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID
Предполагаемый план выполнения показывает 57% в обновлении таблицы и 40% в хэш-совпадении (агрегат). Я немного покопался и наткнулся на тему подсказок JOIN. Поэтому я добавил подсказку LOOP к своему внутреннему соединению и WA-ZHAM! Новый план выполнения показывает 38% в обновлении таблицы и 58% в поиске индекса.
Так что я собирался начать применять подсказки LOOP ко всем моим запросам, пока благоразумие не одолело меня. После некоторого поиска в Google я понял, что подсказки JOIN не очень хорошо освещены в BOL. Следовательно...
- Может кто-нибудь, пожалуйста, скажите мне, почему применение подсказок LOOP ко всем моим запросам - плохая идея. Я где-то читал, что LOOP JOIN является методом JOIN по умолчанию для оптимизатора запросов, но не может проверить правильность этого утверждения?
- Когда используются подсказки JOIN? Когда дерьмо поразит поклонника, а убийц призраков нет в городе?
- В чем разница между подсказками LOOP, HASH и MERGE? BOL утверждает, что MERGE кажется самым медленным, но какое применение имеет каждая подсказка?
Спасибо за ваше время и помощь людям!
Я использую SQL Server 2008 BTW. Указанные выше статистические данные являются ОЦЕНОЧНЫМИ планами выполнения.
2 ответа
Может кто-нибудь, пожалуйста, скажите мне, почему применение подсказок LOOP ко всем моим запросам - плохая идея. Я где-то читал, что LOOP JOIN является методом JOIN по умолчанию для оптимизатора запросов, но не может проверить правильность этого утверждения?
Потому что это лишает оптимизатора возможности рассмотреть другие методы, которые могут быть более эффективными.
Когда используются подсказки JOIN? Когда дерьмо поразит поклонника, а убийц призраков нет в городе?
Когда распределение данных (по которому оптимизатор принимает свои решения) сильно искажено и статистика не может правильно его представить.
В чем разница между подсказками LOOP, HASH и MERGE? BOL утверждает, что MERGE кажется самым медленным, но какое применение имеет каждая подсказка?
Это разные алгоритмы.
LOOP
это вложенные циклы: для каждой записи из внешней таблицы во внутренней таблице выполняется поиск совпадений (с использованием индекса доступности). Быстрее всего, когда только небольшая часть записей из обеих таблиц удовлетворяетJOIN
иWHERE
условия.MERGE
Сортировки обеих таблиц обходят их в порядке сортировки, пропуская непревзойденные записи. Самый быстрый дляFULL JOIN
s и когда оба набора записей уже отсортированы (из предыдущих операций сортировки или когда используется путь доступа к индексу)HASH
создать хеш-таблицу во временном хранилище (памяти илиtempdb
) из одной из таблиц и ищет ее для каждой записи из другой. Быстрее всего, если большая часть записей из любой таблицы соответствуетWHERE
а такжеJOIN
состояние.
Расчетный план выполнения показывает 57% в обновлении таблицы и 40% в хэш-совпадении (агрегат). Я немного покопался и наткнулся на тему подсказок JOIN. Поэтому я добавил подсказку LOOP к своему внутреннему соединению и WA-ZHAM! Новый план выполнения показывает 38% в обновлении таблицы и 58% в поиске индекса.
Конечно, это означает, что ваш предложенный план хуже? Предполагая, что обновление таблицы занимает постоянное время, теперь она опережает активность индекса.