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

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

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

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

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

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

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

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

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

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

ПримечаниеПримечание

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

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

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

ПримечаниеПримечание

Переключение ролей происходит независимо от подсказок в запросе или структуры запроса. Событие «переключение ролей» не отображается в плане запроса, и сообщение о нем выдается пользователю непосредственно после выполнения.

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

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

ПримечаниеПримечание

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

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