Вопрос

Недавно я пытался оптимизировать этот запрос

UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z 
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID

Предполагаемый план выполнения показывает 57% при обновлении таблицы и 40% при совпадении хэша (Aggregate).Я немного покопался и наткнулся на тему подсказок о присоединении.Поэтому я добавил подсказку ЦИКЛА к своему внутреннему соединению и ВА-ЖАМ!Новый план выполнения показывает 38% при обновлении таблицы и 58% при поиске по индексу.

Итак, я собирался начать применять циклические подсказки ко всем своим запросам, пока благоразумие не взяло верх надо мной.Немного погуглив, я понял, что подсказки по объединению не очень хорошо описаны в BOL.Следовательно...

  1. Может кто-нибудь, пожалуйста, сказать мне, почему применение подсказок ЦИКЛА ко всем моим запросам - плохая идея.Я где-то читал, что соединение ЦИКЛА является методом соединения по умолчанию для оптимизатора запросов, но не смог проверить правильность инструкции?
  2. Когда используются подсказки для ОБЪЕДИНЕНИЯ?Когда дерьмо разлетится на куски, а охотников за привидениями не будет в городе?
  3. В чем разница между подсказками ЦИКЛА, ХЭША и слияния?BOL утверждает, что СЛИЯНИЕ кажется самым медленным, но каково применение каждой подсказки?

Спасибо за ваше время и помощь людям!

Кстати, я запускаю SQL Server 2008.Статистические данные, упомянутые выше, являются ОЦЕНОЧНЫМИ планами выполнения.

Это было полезно?

Решение

Может кто-нибудь, пожалуйста, сказать мне, почему применение подсказок ЦИКЛА ко всем моим запросам - плохая идея.Я где-то читал, что соединение ЦИКЛА является методом соединения по умолчанию для оптимизатора запросов, но не смог проверить правильность инструкции?

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

Когда используются подсказки для ОБЪЕДИНЕНИЯ?Когда дерьмо разлетится на куски, а охотников за привидениями не будет в городе?

Когда распределение данных (на основе которых оптимизатор принимает свои решения) сильно искажено и статистика не в состоянии правильно его представить.

В чем разница между подсказками ЦИКЛА, ХЭША и слияния?BOL утверждает, что СЛИЯНИЕ кажется самым медленным, но каково применение каждой подсказки?

Это разные алгоритмы.

  1. LOOP является вложенными циклами:для каждой записи из внешней таблицы выполняется поиск совпадений во внутренней таблице (с использованием индекса доступных).Самый быстрый, когда только небольшая часть записей из обеих таблиц удовлетворяет JOIN и тот WHERE условия.

  2. MERGE сортирует обе таблицы, просматривает их в порядке сортировки, пропуская несогласованные записи.Самый быстрый для FULL JOINs и когда оба набора записей уже отсортированы (в результате предыдущих операций сортировки или когда используется путь доступа к индексу)

  3. HASH создайте хэш-таблицу во временном хранилище (память или tempdb) из одной из таблиц и ищет в ней каждую запись из другой.Быстрее всего, если большая часть записей из любой таблицы соответствует WHERE и JOIN состояние.

Другие советы

Предполагаемый план выполнения показывает 57%% для обновления таблицы и 40% для хэша Совпадение (агрегирование).Я немного покопался вокруг и наткнулся на тему Подсказки по присоединению.Итак, я добавил подсказку цикла в мое внутреннее соединение и ВА-ЖАМ!Новый план выполнения показывает 38% в таблице Обновление и 58% при поиске по индексу.

Конечно, это означает, что предложенный вами план хуже?Предполагая, что обновление таблицы занимает постоянное время, теперь оно обходится без затрат из-за активности индекса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top