Поделиться через


Класс событий Exchange Spill

Класс событий Exchange Spill показывает, что буфер связи в параллельном плане запроса временно записан в базу данных tempdb. Это происходит редко и только если план запроса содержит несколько просмотров диапазона.

Как правило, запрос Transact-SQL, формирующий такие просмотры диапазонов, содержит много операторов BETWEEN, каждый из которых выбирает диапазон строк из таблицы или индекса. Другой способ получить несколько диапазонов — использовать такое выражение, как (T.a > 10 AND T.a < 20) OR (T.a > 100 AND T.a < 120). Кроме того, планы запросов должны выполнять просмотр этих диапазонов исключительно в упорядоченном виде либо из-за наличия предложения ORDER BY в T.a, либо из-за того, что итератор плана обрабатывает кортежи строго в порядке сортировки.

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

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

Обменные сбросы могут быть кратковременными и иногда исчезают в результате перераспределения данных.

Существует несколько вариантов избежать обменных сбросов:

  • не используйте предложение ORDER BY, если не нужен упорядоченный результирующий набор;

  • если предложения ORDER BY необходимо, то удалите из него столбец, участвующий в просмотрах нескольких диапазонов (T.a — в предыдущем примере);

  • с помощью подсказки индекса сделайте так, чтобы оптимизатор использовал другой путь доступа к нужной таблице;

  • перепишите запрос, чтобы получить другой план выполнения запроса;

  • Используйте принудительное последовательное выполнение запроса. Для этого добавьте в конец запроса или операции с индексом параметр MAXDOP = 1. Дополнительные сведения см. в разделах Параметр max degree of parallelism и Настройка параллельных операций с индексами.

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

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

Столбцы данных класса событий Exchange Spill

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

Тип данных

Описание

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

Фильтруемый

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

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

27

Нет

EventSequence

int

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

51

Нет

EventSubClass

int

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

1 = Начало сброса

2 = Завершение сброса

21

Да

GroupID

int

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

66

Да

HostName

nvarchar

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

8

Да

IsSystem

int

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

60

Да

LoginName

nvarchar

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

11

Да

LoginSid

image

Идентификационный номер в системе безопасности (SID) вошедшего в систему пользователя. Эти данные можно найти в таблице syslogins базы данных master. Каждый идентификатор SID уникален для каждого имени входа на сервере.

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 по имени Имя_входа1 и при выполнении инструкции под именем «Имя_входа2» SessionLoginName содержит значение «Имя_входа1», а LoginName содержит значение «Имя_входа2». В этом столбце отображаются как имена входа SQL Server, так и имена входа Windows.

64

Да

SPID

int

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

12

Да

StartTime

datetime

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

14

Да

TransactionID

bigint

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

4

Да

XactSequence

bigint

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

50

Да