Основи плану виконання - плутанина хеш-матчу


39

Я починаю вивчати плани виконання і я плутаюсь щодо того, як саме працює хеш-матч і чому він буде використаний у простому з'єднанні:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

введіть тут опис зображення

Як я розумію, результати сканування верхнього індексу стають хешованими, і кожен рядок у нижньому скануванні кластеризованого індексу переглядається вгору. Я розумію, як працюють хеш-таблиці принаймні до деякої міри, але я плутаюсь, які значення точно хешируються на прикладі, як цей.

Що має сенс для мене, це загальне поле між ними, id, хеширується - але якщо це так, то чому хеш-номер?

Відповіді:


29

Як цитує відповідь SQLRockstar

найкраще для великих несортованих входів.

Тепер,

  • від сканування індексу Users.DisplayName (припускається, що не кластеризовано), ви отримуєте Users.Id (якщо припустити кластеризацію) = несортовано
  • Ви також скануєте дописи на OwnerUserId = несортовано

Це 2 не упорядковані входи.

Я б розглядав індекс таблиці повідомлень на OwnerUserId, включаючи заголовок. Це додасть певного замовлення на одній стороні входу до JOIN + він буде охоплювати індекс

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Потім ви можете виявити, що індекс Users.DisplayName не буде використовуватися, і він замість цього сканує ПК.


1
Ну добре, я бачу зараз, я думав про Users.DisplayName був замовлений ПК, що просто не так. Зараз використання Hash має для мене набагато більше сенсу. Дякую!
Кайл Брандт

1
Ви також можете спробувати OPTION (FAST n)підказку, де n - приблизна кількість рядків, яку ви очікуєте. Це буде робити - це зміщення оптимізатора до вкладених циклів, а не хеш-з'єднань, коли n низький. Причина полягає в тому, що хеш-з'єднання швидкі для великих об'єднань, але мають високу вартість запуску. Вкладені петлі коштують дорого за ряд, але можна розпочати дуже дешево. Тож справа в точній настройці виходячи з ваших фактичних даних та схеми доступу.
Гай

1
@Gaius: Особисто я краще матиму індекси, ніж підказки. Підказка корисна лише для запиту, коли ви додаєте його. Ака натяк з часом стає відповідальністю. Індекси, як правило, корисні набагато довше.
gbn

1
це не те, ні пропозиція :-)
Гай

14

Від http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

"Хеш-з'єднання - одна з дорожчих операцій приєднання, оскільки для створення з'єднання потрібно створити хеш-таблицю. Це сказало, що саме з'єднання найкраще для великих несортованих входів. Це найбільше об'єм пам'яті з усіх. приєднань

Спочатку хеш-з'єднання зчитує один із входів і хеширует стовпець приєднання, а результуючі значення хешу та стовпців поміщає в хеш-таблицю, накопичену в пам'яті. Потім він зчитує всі рядки на другому вході, хеширует їх і перевіряє рядки в отриманому хеш-відрі на приєднання рядків ".

які посилання на цю публікацію:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH


Тож якщо це просто поля id, я думаю, я не розумію переваги хешування поля id?
Кайл Брандт

+1 для посилання на блог Крейга Фрідмана, доступні інші статті про приєднання: blogs.msdn.com/b/craigfr/archive/tags/joins
Джефф,

9

Перевага хешування числового поля полягає в тому, що ви приймаєте більше значення і розбиваєте його на більш дрібні шматочки, щоб воно могло вміститися в хеш-таблицю.

Ось як описує це Грант Фрітчі:

"З іншого боку, хеш-таблиця - це структура даних, яка розділяє всі елементи на категорії однакового розміру або відра, щоб забезпечити швидкий доступ до елементів. , ви можете взяти рядок із таблиці, хеш її в хеш-значенні, а потім зберегти хеш-значення в хеш-таблиці. "

Ви також можете отримати безкоштовну копію його книги "Розсікання планів виконання SQL Server" за посиланням із наступної статті:

Джерело: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/


Ще одна цікава серія статей про JOINS
Джефф,

Я працюю по-своєму, хоча розбираю плани виконання SQL Server - це чудово! Але я трохи зациклювався на цьому питанні :-P
Кайл Брандт

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.