2010-03-15 2 views
3

Недавно я пытался оптимизировать этот запрос,SQL SERVER 2008 РЕГИСТРИРУЙТЕСЬ намеков

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

Предполагаемый план выполнения показывает 57% на таблице обновления и 40% на Hash Match (складочном). Я немного пощупал и наткнулся на тему подсказок JOIN. Поэтому я добавил подсказку LOOP к моему внутреннему соединению и WA-ZHAM! Новый план выполнения показывает 38% в обновлении таблицы и 58% по поиску индекса.

Таким образом, я собирался начать применять LOOP-подсказки ко всем моим запросам, пока благоразумие не улучшит меня. После некоторого поиска в Google я понял, что подсказки JOIN не очень хорошо освещены в BOL. Поэтому ...

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

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

Я запускаю SQL Server 2008 BTW. Статистические данные, упомянутые выше, представляют собой планируемые планы выполнения.

+0

Перед тем, как вникать в это, обновляются ли ваши индексы и статистика? – Paddy

+0

Да, они актуальны – super9

ответ

10

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

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

Когда используются подсказки JOIN? Когда sh * t попадает в вентилятор, а призрачные нарушители не в городе?

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

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

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

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

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

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

+0

Отличное объяснение! Я не думаю, что вы могли бы дать свои 2 цента на то, что ответ Мартина? – super9

2

Расчетный план выполнение показывает 57% на таблицу Update и 40% на Хэш Match (заполнитель). Я сделал несколько snooping вокруг и наткнулся на тему СОВЕТЫ СОВЕТЫ. Поэтому я добавил подсказку LOOP к моему внутреннему соединению и WA-ZHAM! Новый план выполнения показывает 38% в таблице Обновление и 58% по поиску индекса.

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

+0

Это справедливое предположение? У меня всегда создавалось впечатление, что основная работа над поиском индексов - это путь. – super9

+0

Я думаю, что это справедливое предположение, хотя я счастлив, что верю, если я ошибаюсь. Есть ли кластерный индекс в Analytics.UserGUID? Если это обновление GUID для другого значения, вероятно, вызовет справедливый бит IO, который может объяснить любую проблему с производительностью, которую вы получаете. –

+0

У меня есть некластеризованный индекс в Analytics.UserGUID. Я обновляю столбцы UserID, а не UserGUID. У меня нет индексов в столбце Analytics.UserID. – super9