Exchange Spill, класс событий

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

Как правило, запрос Transact-SQL, создающий такие проверки диапазона, имеет множество операторов BETWEEN, каждый из которых выбирает диапазон строк из таблицы или индекса. Кроме того, можно получить несколько диапазонов с помощью таких выражений, как (T.a > 10 AND T.a20 < ) ИЛИ (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, поэтому можно определить, какой оператор или операция вызывает ошибку.

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

Имя столбца данных Тип данных Description Идентификатор столбца Доступно для фильтрации
ApplicationName nvarchar Имя клиентского приложения, создавшего подключение к экземпляру SQL Server. Этот столбец заполняется значениями, передаваемыми приложением, а не отображаемым именем программы. 10 Да
ClientProcessID int Идентификатор, присвоенный главным компьютером сервера процессу, в котором работает клиентское приложение. Этот столбец данных заполняется в том случае, если клиент предоставляет идентификатор клиентского процесса. 9 Да
DatabaseID int Идентификатор базы данных, указанной в инструкции USE database , или database по умолчанию, если для данного экземпляра инструкция USE не выполнялась. Sql Server Profiler отображает имя базы данных, если столбец данных ServerName фиксируется в трассировке и сервер доступен. Определите значение для базы данных, используя функцию DB_ID. 3 Да
DatabaseName nvarchar Имя базы данных, в которой выполняется пользовательская инструкция. 35 Да
EventClass int Тип события = 127. 27 No
EventSequence int Последовательность данного события в запросе. 51 No
EventSubClass int Тип подкласса события.

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

2 = Завершение сброса
21 Да
GroupID int Идентификатор группы рабочей нагрузки, в которой запускается событие трассировки SQL. 66 Да
HostName nvarchar Имя компьютера, на котором выполняется клиентская программа. Этот столбец данных заполняется, если клиент предоставляет имя узла. Чтобы определить имя узла, используйте функцию HOST_NAME. 8 Да
IsSystem int Указывает, произошло событие в системном или в пользовательском процессе. 1 = системный, 0 = пользовательский. 60 Да
LoginName nvarchar Имя имени входа пользователя (имя входа безопасности SQL Server или учетные данные для входа Windows в формате <DOMAIN>\<username>). 11 Да
LoginSid Изображение Идентификатор безопасности вошедшего в систему пользователя. Эти данные можно найти в таблице syslogins базы данных master . Значение идентификатора безопасности уникально для каждого имени входа на сервере. 41 Да
NTDomainName nvarchar Домен Windows, к которому принадлежит пользователь. 7 Да
NTUserName nvarchar Имя пользователя Windows. 6 Да
ObjectID int Идентификатор объекта, назначенный системой. Соответствует идентификатору узла в Showplan. 22 Да
RequestID int Идентификатор запроса, содержащего инструкцию. 49 Да
ServerName nvarchar Имя отслеживаемого экземпляра SQL Server. 26 No
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 Да

См. также

sp_trace_setevent (Transact-SQL)
Установка параметров индекса
ALTER INDEX (Transact-SQL)