Класс событий Hash Warning

Класс событий Hash Warning можно использовать для мониторинга возникновения рекурсии хэша или остановки хэширования (аварийного хэширования) во время операции хэширования.

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

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

Рекурсии и аварийное хэширование приводят к снижению производительности сервера. Для устранения или уменьшения частоты появления рекурсий и аварийного хэширования можно применить следующие методы.

  • Удостовериться в том, что для соединяемых или группируемых столбцов существует статистика.

  • Если для столбцов существует статистика, обновить ее.

  • Использовать другой тип соединения. Например, соединения MERGE или LOOP, если это допустимо.

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

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

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

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

Важное примечаниеВажно!

Для обнаружения возникновения события Hash Warning при формировании плана выполнения запроса оптимизатором запросов в трассировке необходимо также собрать класс событий Showplan. Можно выбрать любой класс событий Showplan, за исключением классов событий Showplan Text и Showplan Text (Unencoded), которые не возвращают идентификатор узла. Идентификаторы узлов в классе событий Showplan идентифицируют каждую операцию, выполняемую оптимизатором запросов при формировании плана выполнения запроса. Эти операции называются операторами, и каждый оператор в классе событий Showplan имеет свой идентификатор узла. Столбец ObjectID для событий Hash Warning соответствует идентификатору узла Showplan, поэтому можно определить, какой оператор или операция вызывает ошибку. Дополнительные сведения о классах событий Showplan см. в разделе Отображение плана выполнения с помощью классов событий приложения SQL Server Profiler.

Столбцы данных класса событий Hash Warning

Имя столбца данных

Тип данных

Описание

Идентификатор столбца

Фильтруемый

ApplicationName

nvarchar

Имя клиентского приложения, установившего соединение с экземпляром SQL Server. Этот столбец заполняется значениями, передаваемыми приложением, а не отображаемым именем программы.

10

Да

ClientProcessID

int

Идентификатор, присвоенный сервером процессу, в котором работает клиентское приложение. Этот столбец данных заполняется в том случае, если клиент вводит идентификатор клиентского процесса.

9

Да

DatabaseID

int

Идентификатор базы данных, указанной в инструкции USE database, или базы данных по умолчанию, если для данного экземпляра инструкция USE database не выполнялась. Программа Приложение SQL Server Profiler отображает имя базы данных, если столбец данных ServerName фиксируется при трассировке и при этом сервер доступен. Значение для базы данных определяется с помощью функции DB_ID.

3

Да

DatabaseName

nvarchar

Имя базы данных, в которой выполняется пользовательская инструкция.

35

Да

EventClass

int

Тип события = 55.

27

Нет

EventSequence

int

Порядковый номер данного события в запросе.

51

Нет

EventSubClass

int

Тип подкласса событий.

0 = рекурсия.

1 = аварийное завершение.

21

Да

GroupID

int

Идентификатор группы рабочей нагрузки, в которой запускается событие SQL Trace.

66

Да

HostName

nvarchar

Имя компьютера, на котором работает клиентская программа. Этот столбец данных заполняется, если клиент предоставляет имя узла. Чтобы определить имя узла, используйте функцию HOST_NAME.

8

Да

IntegerData

int

Уровень рекурсии (только рекурсия хэширования).

25

Да

IsSystem

int

Указывает, произошло ли событие в системном или в пользовательском процессе: 1 = системный, 0 = пользовательский.

60

Да

LoginName

nvarchar

Имя входа пользователя (либо имя входа безопасности SQL Server, либо учетные данные входа Windows в формате <домен>\<имя_пользователя>).

11

Да

LoginSid

image

Идентификатор безопасности для пользователя, вошедшего в систему. Эти сведения можно найти в представлении каталога sys.server_principals. Значение идентификатора безопасности уникально для каждого имени входа на сервере.

41

Да

NTDomainName

nvarchar

Домен Windows, к которому принадлежит пользователь.

7

Да

NTUserName

nvarchar

Имя пользователя Windows.

6

Да

ObjectID

int

Идентификатор узла для корня группы хэширования, участвующей в перераспределении секций. Соответствует идентификатору узла в Showplan.

22

Да

RequestID

int

Идентификатор запроса, содержащего инструкцию.

49

Да

ServerName

nvarchar

Имя трассируемого экземпляра SQL Server.

26

SessionLoginName

nvarchar

Имя входа пользователя, создавшего этот сеанс. Например, при подключении к SQL Server по имени Login1 и при выполнении инструкции под именем Login2, SessionLoginName будет содержать значение Login1, а LoginName — значение Login2. В данном столбце отображаются имена входа SQL Server и Windows.

64

Да

SPID

int

Идентификатор сеанса, в котором произошло событие.

12

Да

StartTime

datetime

Время начала события, если оно известно.

14

Да

TransactionID

bigint

Назначенный системой идентификатор транзакции.

4

Да

XactSequence

bigint

Маркер, который описывает текущую транзакцию.

50

Да