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)