Classe de evento Exchange Spill
A classe de evento Exchange Spill indica que os buffers de comunicação em um plano de consulta paralelo foram temporariamente gravados no banco de dados tempdb. Isso ocorre raramente e somente quando um plano de consulta tiver exames de vários intervalos.
Normalmente, a consulta do Transact-SQL que gera tais exames de intervalo tem muitos operadores BETWEEN, cada um dos quais seleciona um intervalo de linhas de uma tabela ou um índice. Uma alternativa é obter vários intervalos usando expressões como (T.a > 10 AND T.a < 20) ou (T.a > 100 AND T.a < 120). Além disso, os planos de consulta devem exigir que esses intervalos sejam examinados em ordem, porque existe uma cláusula ORDER BY em T.a ou um iterador do plano requer que ele consuma as tuplas na ordem classificada.
Quando um plano de consulta para tal consulta tem vários operadores de Paralelismo, os buffers de comunicação de memória usados pelos operadores de Paralelismo ficam completos e pode surgir uma situação em que o progresso da execução da consulta é interrompido. Nessa situação, um dos operadores de Paralelismo grava seu buffer de saída em tempdb (uma operação chamada exchange spill) de modo que possa consumir linhas de alguns de seus buffers de entrada. Finalmente, as linhas derramadas são devolvidas ao consumidor quando este estiver pronto para consumi-las.
Muito raramente, vários exchange spills podem ocorrer no mesmo plano de execução, fazendo com que a execução da consulta seja lenta. Se você notar mais de cinco derramamentos na execução do mesmo plano de consulta, contate seu profissional de suporte.
Algumas vezes, os exchange spills são transitórios e podem desaparecer como alterações de distribuição de dados.
Há várias maneiras de evitar eventos de exchange spills:
Omita a cláusula ORDER BY se você não precisar que o conjunto de resultados seja ordenado.
Se ORDER BY for necessário, elimine a coluna que participa de vários exames de intervalo (T.a no exemplo acima) da cláusula ORDER BY.
Usando uma dica de índice, force o otimizador a usar um caminho de acesso diferente na tabela em questão.
Reescreva a consulta para produzir um plano de execução de consulta diferente.
Force a execução serial da consulta adicionando a opção MAXDOP = 1 no final da operação da consulta ou índice. Para obter mais informações, consulte Opção max degree of parallelism e Configurando operações de índice paralelo.
Importante |
---|
Para determinar onde o evento Exchange Spill está ocorrendo quando o otimizador de consultas gera um plano de execução, é também necessário coletar uma classe de evento Showplan no rastreamento. É possível escolher qualquer uma das classes de evento Showplan, exceto as classes de evento Showplan Text e Showplan Text (Unencoded), que não retornam a ID do nó. As ID do nó nos Showplans identificam cada operação que o otimizador de consultas executa ao gerar um plano de execução de consulta. Essas operações são chamadas operadores e cada operador no Showplan possui uma ID de nó. A coluna ObjectID dos eventos Exchange Spill corresponde à ID do nó nos Showplans. Assim, é possível determinar o operador ou a operação que gerou o erro. Para obter mais informações sobre as classes de evento Showplan, consulte Exibindo planos de execução usando as classes de evento do SQL Server Profiler |
Colunas de dados da classe de evento Exchange Spill
Nome da coluna de dados |
Tipo de dados |
Descrição |
ID da coluna |
Filtrável |
---|---|---|---|---|
ApplicationName |
nvarchar |
Nome do aplicativo cliente que criou a conexão com uma instância do SQL Server. Essa coluna é populada com os valores passados pelo aplicativo e não com o nome exibido do programa. |
10 |
Sim |
ClientProcessID |
int |
ID atribuída pelo computador host ao processo em que o aplicativo cliente está sendo executado. Essa coluna de dados é populada se o cliente fornecer a ID do processo cliente. |
9 |
Sim |
DatabaseID |
int |
ID do banco de dados especificada pela instrução USE do database ou pelo banco de dados padrão, se nenhuma instrução USE database tiver sido emitida para uma determinada instância. O SQL Server Profiler exibirá o nome do banco de dados se a coluna de dados ServerName for capturada no rastreamento e o servidor estiver disponível. Determine o valor de um banco de dados usando a função DB_ID. |
3 |
Sim |
DatabaseName |
nvarchar |
Nome do banco de dados no qual a instrução do usuário está sendo executada. |
35 |
Sim |
EventClass |
int |
Tipo de evento = 127. |
27 |
Não |
EventSequence |
int |
Seqüência de um determinado evento na solicitação. |
51 |
Não |
EventSubClass |
int |
Tipo de subclasse de evento. 1= Início do derramamento 2= Término do derramamento |
21 |
Sim |
GroupID |
int |
ID do grupo de carga de trabalho no qual o evento Rastreamento SQL é disparado. |
66 |
Sim |
HostName |
nvarchar |
Nome do computador no qual o cliente está sendo executado. Essa coluna de dados será populada se o cliente fornecer o nome do host. Para determinar o nome do host, use a função HOST_NAME. |
8 |
Sim |
IsSystem |
int |
Indica se o evento ocorreu em um processo do sistema ou do usuário. 1 = sistema, 0 = usuário. |
60 |
Sim |
LoginName |
nvarchar |
Nome de logon do usuário (logon de segurança do SQL Server ou as credenciais de logon do Windows no formato <DOMÍNIO>\<nome_do_usuário>). |
11 |
Sim |
LoginSid |
image |
Número SID (identificação de segurança) do usuário que fez logon. É possível encontrar essas informações na tabela syslogins do banco de dados mestre. Cada SID é exclusivo de cada logon no servidor. |
41 |
Sim |
NTDomainName |
nvarchar |
Domínio do Windows ao qual o usuário pertence. |
7 |
Sim |
NTUserName |
nvarchar |
Nome de usuário do Windows. |
6 |
Sim |
ObjectID |
int |
ID do objeto atribuída pelo sistema. Corresponde à ID do nó nos Showplans. |
22 |
Sim |
RequestID |
int |
ID da solicitação que contém a instrução. |
49 |
Sim |
ServerName |
nvarchar |
Nome da instância do SQL Server que está sendo rastreada. |
26 |
Não |
SessionLoginName |
nvarchar |
Nome de logon do usuário que originou a sessão. Por exemplo, se você conectar ao SQL Server usando o Logon1 e executar uma instrução como Logon2, o SessionLoginName mostrará o Logon1 e o LoginName mostrará o Logon2. Essa coluna exibe logons do SQL Server e do Windows. |
64 |
Sim |
SPID |
int |
ID da sessão na qual o evento ocorreu. |
12 |
Sim |
StartTime |
datetime |
Hora de início do evento, se disponível. |
14 |
Sim |
TransactionID |
bigint |
ID da transação atribuída pelo sistema. |
4 |
Sim |
XactSequence |
bigint |
Token que descreve a transação atual. |
50 |
Sim |
Consulte também