Советы по SQL Server 2008 JOIN - PullRequest
       8

Советы по SQL Server 2008 JOIN

3 голосов
/ 15 марта 2010

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

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 . Поэтому ...

  1. Может кто-нибудь сказать мне, почему применение подсказок LOOP ко всем моим запросам - плохая идея. Я где-то читал, что LOOP JOIN является методом JOIN по умолчанию для оптимизатора запросов, но не может проверить правильность утверждения?
  2. Когда используются подсказки JOIN? Когда дерьмо поразит поклонника, а убийц призраков не будет в городе?
  3. В чем разница между подсказками LOOP, HASH и MERGE? BOL утверждает, что MERGE кажется самым медленным, но какое применение имеет каждая подсказка?

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

Я использую SQL Server 2008 BTW. Указанные выше статистические данные являются ОЦЕНЕННЫМИ планами выполнения.

Ответы [ 2 ]

10 голосов
/ 15 марта 2010

Может кто-нибудь сказать мне, почему применение подсказок LOOP ко всем моим запросам - плохая идея. Я где-то читал, что LOOP JOIN является методом JOIN по умолчанию для оптимизатора запросов, но не может проверить правильность утверждения?

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

Когда используются подсказки JOIN? Когда дерьмо поразит поклонника, а убийц призраков не будет в городе?

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

В чем разница между подсказками LOOP, HASH и MERGE? BOL утверждает, что MERGE кажется самым медленным, но какое применение имеет каждая подсказка?

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

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

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

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

2 голосов
/ 15 марта 2010

Расчетный план выполнения показывает 57% на обновление таблицы и 40% на хэш Матч (Совокупность). Я немного подглядывал вокруг и наткнулся на тему Присоединяйтесь к намек. Поэтому я добавил подсказку LOOP мое внутреннее соединение и ва-жам! Новый План выполнения показывает 38% в таблице Обновление и 58% при поиске индекса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...