Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 tem várias verificações de intervalo.
Normalmente, a consulta Transact-SQL que gera essas verificações de intervalo tem muitos operadores BETWEEN, cada um dos quais seleciona um intervalo de linhas de uma tabela ou um índice. Como alternativa, você pode obter vários intervalos usando expressões como (T.a > 10 AND T.a < 20) OR (T.a > 100 AND T.a < 120). Além disso, os planos de consulta devem exigir que esses intervalos sejam verificados em ordem, seja porque há uma cláusula ORDER BY em T.a, ou porque um iterador dentro do plano requer que as tuplas sejam consumidas em ordem ordenada.
Quando um plano de consulta para essa consulta tem vários operadores de paralelismo , os buffers de comunicação de memória usados pelos operadores paralelismo ficam cheios e pode surgir uma situação em que o progresso da execução da consulta é interrompido. Nessa situação, um dos operadores Paralelismo grava seu buffer de saída em tempdb (uma operação chamada transbordo de troca) para que ele possa consumir linhas de alguns de seus buffers de entrada. Eventualmente, as linhas derramadas são retornadas ao consumidor quando o consumidor está pronto para consumi-las.
Raramente, múltiplos transbordamentos de troca podem ocorrer dentro do mesmo plano de execução, causando lentidão na execução da consulta. Se você observar mais de cinco vazamentos na execução do mesmo plano de consulta, entre em contato com seu profissional de suporte.
Às vezes, os derramamentos do Exchange são transitórios e podem desaparecer à medida que a distribuição de dados é alterada.
Há várias maneiras de evitar derramamentos durante trocas:
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 das várias varreduras 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 ao final da operação de consulta ou índice. Para obter mais informações, consulte Configurar o grau máximo de opção de configuração do servidor de paralelismo e configurar operações de índice paralelo.
Importante
Para determinar onde o evento Exchange Spill está ocorrendo quando o otimizador de consulta gera um plano de execução, você também deve coletar uma classe de evento Showplan no rastreamento. Você pode escolher qualquer uma das classes de evento Showplan, exceto as classes de evento Showplan Text e Showplan Text (Unencoded), que não retornam uma ID do Nó. IDs de nó em Planos de Execução identificam cada operação que o otimizador de consulta executa quando gera um plano de execução de consulta. Essas operações são chamadas de operadores e cada operador em um showplan tem uma ID de nó. A coluna ObjectID para eventos do Exchange Spill corresponde à ID do Nó nos Showplans para que você possa determinar qual operador, ou operação, está causando o erro.
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 será populada se o cliente fornecer a ID de processo do cliente. | 9 | Sim |
| DatabaseID | int | ID do banco de dados especificado pela instrução de banco de dados USE ou o banco de dados padrão se nenhuma instrução de banco de dados USE 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 para 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 | Sequência de um determinado evento na solicitação. | 51 | Não |
| EventSubClass | int | Tipo de subclasse de evento. 1=Início do derramamento 2=Fim do derramamento |
21 | Sim |
| GroupID | int | ID do grupo de carga de trabalho no qual o evento de Rastreamento do SQL dispara. | 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 do logon do usuário (logon de segurança do SQL Server ou as credenciais de logon do Windows na forma de <DOMÍNIO>\<nome de> usuário). | 11 | Sim |
| LoginSid | imagem | Número SID (identificação de segurança) do usuário que fez logon. Você pode encontrar essas informações na tabela syslogins do banco de dados mestre . Cada SID é exclusivo para cada logon no servidor. | 41 | Sim |
| NTDomainName | nvarchar | O domínio do Windows ao qual o usuário pertence. | 7 | Sim |
| NTUserName | nvarchar | Nome do usuário do Windows. | 6 | Sim |
| ObjectID | int | ID de objeto atribuída pelo sistema. Corresponde à ID do Nó em Planos de Execução. | 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ê se conectar ao SQL Server usando Login1 e executar uma instrução como Login2, SessionLoginName mostrará Login1 e LoginName mostrará Login2. Esta coluna exibe logons do SQL Server e do Windows. | 64 | Sim |
| SPID | int | Identificação da sessão em que ocorreu o evento. | 12 | Sim |
| StartTime | data e hora | 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
sp_trace_setevent (Transact-SQL)
Definir opções de índice
ALTER INDEX (Transact-SQL)