Основные сведения о хэш-соединениях

Хэш-соединение имеет два входа: конструктивный и пробный. Оптимизатор запроса распределяет роли таким образом, при котором меньшему входу присваивается значение «конструктивный».

Хэш-соединения используются во многих операциях совпадающих множеств: внутреннее соединение; левое, правое и полное внешнее соединение; левое и правое полусоединение; пересечение; cоединение; разность. Дополнительно модификация хэш-соединения применяется для двойного удаления и группирования, например при расчете функции SUM(зарплата) GROUP BY по отделу. В указанной модификации используется общий вход как для конструктивной, так и для пробной ролей.

В представленных ниже разделах описываются различные типы хэш-соединений: хэш-соединения в памяти, плавные и рекурсивные хэш-соединения.

Хэш-соединения в памяти

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

Плавное хэш-соединения

Если размер конструктивного входного значения превышает максимально допустимый объем памяти, то хэш-соединение проводится в несколько шагов. Указанный процесс называется плавным хэш-соединением. Каждый шаг состоит из конструктивной и пробной частей. Исходные конструктивные и пробные входные данные разбиваются на несколько файлов (для этого используются хэш-функции ключей). При использовании хэш-функции для хэш-ключей обеспечивается гарантия нахождения соединяемых записей в общей паре файлов. Таким образом, задача соединения двух объемных входных значений разбивается на несколько более мелких задач. Затем хэш-соединение применяется к каждой паре разделенных файлов.

Рекурсивное хэш-соединение

Если объем информации, поступающей на конструктивный вход, настолько велик, что для использования обычного внешнего слияния требуется несколько уровней, то операцию разбиения необходимо проводить за несколько шагов на нескольких уровнях. Дополнительные шаги разбиения используются только для секций большого объема. Чтобы максимально ускорить проведение всех шагов разбиения, используются емкие асинхронные операции ввода-вывода, в результате чего один поток может занимать сразу несколько жестких дисков.

ms189313.note(ru-ru,SQL.90).gifПримечание.
В случае незначительного превышения допустимого объема памяти конструктивными входными данными происходит совмещение элементов хэш-соединения в памяти и плавных хэш-соединений в общий этап. В результате получается гибридное хэш-соединение.

В процессе оптимизации не всегда удается определить тип используемого хэш-соединения. Поэтому, в SQL Server в первую очередь используются хэш-соединения в памяти, а затем, в зависимости от объемов входной конструктивной информации, осуществляется переход на плавное или рекурсивное хэш-соединения.

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

ms189313.note(ru-ru,SQL.90).gifПримечание.
Переключение ролей происходит независимо от подсказок в запросе или структуры запроса. Событие «переключение ролей» не отображается в плане запросов, и сообщение о нем выдается пользователю непосредственно после выполнения.

Аварийная остановка хэша

Термин аварийная остановка хэша иногда используется для описания плавных и рекурсивных хэш-соединений.

ms189313.note(ru-ru,SQL.90).gifПримечание.
Наличие рекурсивных хэш-соединений и аварийных остановок снижает производительность сервера. Если в трассировке содержится много событий-предупреждений хэша, необходимо произвести обновление статистических данных соединяемых столбцов.

Дополнительные сведения об аварийных остановках хэша см. в разделе Класс событий Hash Warning.

См. также

Основные понятия

Основные принципы соединения
Справочник по логическим и физическим операторам

Другие ресурсы

Подсказка в запросе (Transact-SQL)
Анализ запроса

Справка и поддержка

Получение помощи по SQL Server 2005