Класс событий 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 |
Да |
См. также