Основы плана выполнения - «Хеш-матч путаницы»

Я начинаю изучать планы выполнения и путаюсь, как работает хеш-образ и почему он будет использоваться в простом соединении:

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

введите описание изображения здесь>> </p>

<p> Как я понимаю, результаты сканирования индекса Top становятся хеш-файлами, и каждая строка в нижнем кластерном сканировании индексов просматривается. Я понимаю, как хэш-таблицы работают, по крайней мере, в некоторой степени, но я смущен тем, какие значения точно получаются хэшированными в примере вроде этого. </p>

<p> Что бы я чувствовал меня, это общее поле между ними, id, hashed - но если это так, почему hash число? </p></body></html>

37 голосов | спросил Kyle Brandt 23 MarpmWed, 23 Mar 2011 23:56:17 +03002011-03-23T23:56:17+03:0011 2011, 23:56:17

3 ответа


27

Как цитирует ответ SQLRockstar

  

лучше для больших, несортированных входов.

Теперь

  • из индекса индекса users.DisplayName (предполагается, что он некластеризован) вы получаете User.Id (предполагается, что кластеризованный) = unsorted
  • Вы также просматриваете сообщения для OwnerUserId = unsorted

Это 2 неупорядоченных входа.

Я бы рассмотрел индекс в таблице Posts на OwnerUserId, включая Title. Это добавит некоторый порядок на одной стороне входа в JOIN +, он будет охватывать индекс

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

Затем вы можете обнаружить, что индекс Users.DisplayName не будет использоваться, и он сканирует ПК вместо этого.

ответил gbn 24 MaramThu, 24 Mar 2011 09:59:13 +03002011-03-24T09:59:13+03:0009 2011, 09:59:13
13

Из http://sqlinthewild.co.za/index .php /2007/12/30 /выполнение-план-операция-соединяет /

«Хеш-соединение является одной из более дорогих операций соединения, поскольку для создания соединения требуется создание хеш-таблицы. Это означает, что это соединение, которое лучше всего подходит для больших, несортированных входных данных. Это самая большая часть памяти любого из объединений

хеш-соединение сначала считывает один из входов и хеширует столбец объединения и помещает полученный хеш и значения столбца в хэш-таблицу, созданную в памяти. Затем он считывает все строки во втором вводе, хэширует эти и проверяет строки в полученном хэш-ведре для объединения строк.

, который ссылается на этот пост:

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

НТН

ответил SQLRockstar 24 MaramThu, 24 Mar 2011 00:13:45 +03002011-03-24T00:13:45+03:0012 2011, 00:13:45
8

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

Вот как описывает Грант Фричей:

«Хэш-таблица, с другой стороны, представляет собой структуру данных, которая делит все элементы на категории с равным размером или на ковши, чтобы обеспечить быстрый доступ к элементам. Функция хеширования определяет, в каком ведре элемент переходит в Например, вы можете взять строку из таблицы, хешировать ее в хеш-значение, а затем сохранить хеш-значение в хэш-таблицу. "

Вы также можете получить бесплатную копию своей книги «Рассеивание планов выполнения SQL Server» из ссылки из следующей статьи:

Источник: http: //www.simple- talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/

ответил Jeff 24 MaramThu, 24 Mar 2011 04:44:40 +03002011-03-24T04:44:40+03:0004 2011, 04:44:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132