Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
A classe de evento Exchange Spill indica que buffers de comunicação num plano de consulta paralelo foram temporariamente escritos na base de dados tempdb . Isto ocorre raramente e apenas quando um plano de consulta tem múltiplas varridas de alcance.
Normalmente, a consulta Transact-SQL que gera tais varrimentos de intervalo tem muitos operadores ENTRE, cada um dos quais seleciona um intervalo de linhas a partir de uma tabela ou de um índice. Alternativamente, pode obter múltiplos intervalos usando expressões como (T.a > 10 E T.a < 20) OU (T.a > 100 E T.a < 120). Além disso, os planos de consulta devem exigir que estes intervalos sejam varridos por ordem, seja porque existe uma cláusula ORDER BY em T.a, seja porque um iterador dentro do plano exige que consuma as tuplas por ordem ordenada.
Quando um plano de consulta para tal consulta tem múltiplos operadores de paralelismo , os buffers de comunicação de memória usados pelos operadores de paralelismo tornam-se completos, podendo surgir uma situação em que o progresso da execução da consulta para. Nesta situação, um dos operadores de paralelismo escreve o seu buffer de saída em tempdb (uma operação chamada exchange spill) para poder consumir linhas de alguns dos seus buffers de entrada. Eventualmente, as filas derramadas são devolvidas ao consumidor quando este está pronto para as consumir.
Muito raramente, podem ocorrer múltiplos derrames de troca dentro do mesmo plano de execução, fazendo com que a consulta seja executada lentamente. Se notar mais de cinco falhas na execução do mesmo plano de consulta, contacte o seu profissional de apoio.
Os derrames de troca são por vezes transitórios e podem desaparecer à medida que a distribuição dos dados muda.
Existem várias formas de evitar eventos de derrame de troca:
Omita a cláusula ORDER BY se não precisares que o conjunto de resultados seja ordenado.
Se for necessário ORDER BY, elimine a coluna que participa nas varridas de múltiplos intervalos (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 diferente.
Forçar a execução serial da consulta adicionando a opção MAXDOP = 1 ao final da consulta ou da operação de índice. Para mais informações, consulte Configurar o grau máximo de paralelismo Opção de Configuração do Servidor e Configurar Operações de Índice Paralelo.
Importante
Para determinar onde ocorre o evento Exchange Spill quando o otimizador de consultas gera um plano de execução, deve também recolher uma classe de evento Showplan no rastreio. Pode escolher qualquer uma das classes de evento Showplan, exceto as classes de evento Showplan Text e Showplan Text (Unencoded ), que não retornam um ID de nó. Os IDs de nós nos Showplans identificam cada operação que o otimizador de consultas realiza quando gera um plano de execução de consulta. Estas operações são chamadas operadores e cada operador num Showplan tem um ID de Nodo. A coluna ObjectID para eventos de Exchange Spill corresponde ao ID do Nó nos Showplans, para que possas determinar qual operador, ou operação, está a causar o erro.
Colunas de Dados da Classe de Evento de Spill Exchange
| Nome da coluna de dados | Tipo de dados | Description | ID da coluna | Filtrável |
|---|---|---|---|---|
| Nome do aplicativo | nvarchar | Nome do aplicativo cliente que criou a conexão com uma instância do SQL Server. Esta coluna é preenchida com os valores passados pelo aplicativo em vez do nome exibido do programa. | 10 | Yes |
| ClientProcessID | int | ID atribuído pelo computador host ao processo em que o aplicativo cliente está sendo executado. Esta coluna de dados é preenchida se o cliente fornecer o ID do processo do cliente. | 9 | Yes |
| Base de Dados | int | ID da base de dados especificado pela instrução da base de dados USE ou pela base de dados padrão se não tiver sido emitida a instrução USE para uma dada instância. O SQL Server Profiler apresenta o nome da base de dados se a coluna de dados ServerName for capturada no rastreio e o servidor estiver disponível. Determine o valor de um banco de dados usando a função DB_ID. | 3 | Yes |
| DatabaseName | nvarchar | Nome do banco de dados no qual a instrução de usuário está sendo executada. | 35 | Yes |
| EventClass | int | Tipo de evento = 127. | 27 | Não |
| EventSequence | int | Sequência de um determinado evento dentro da solicitação. | 51 | Não |
| EventSubClass | int | Tipo de subclasse de evento. 1=Início do derrame 2=Fim do derrame |
21 | Yes |
| GroupID | int | ID do grupo de carga de trabalho onde o evento Rastreamento SQL é acionado. | 66 | Yes |
| Nome do host | nvarchar | Nome do computador no qual o cliente está sendo executado. Esta coluna de dados é preenchida se o cliente fornecer o nome do anfitrião. Para determinar o nome do anfitrião, use a função HOST_NAME. | 8 | Yes |
| IsSystem | int | Indica se o evento ocorreu em um processo do sistema ou em um processo do usuário. 1 = sistema, 0 = utilizador. | 60 | Yes |
| LoginName | nvarchar | Nome do login do utilizador (seja o login de segurança do SQL Server ou as credenciais de login do Windows na forma <de DOMÍNIO>\<nome> de utilizador). | 11 | Yes |
| LoginSid | image | Número de identificação de segurança (SID) do utilizador com sessão iniciada. Pode encontrar esta informação na tabela syslogins da base de dados mestre . Cada SID é único para cada login no servidor. | 41 | Yes |
| NTDomainName | nvarchar | Domínio do Windows ao qual o usuário pertence. | 7 | Yes |
| NTUserName | nvarchar | Nome de usuário do Windows. | 6 | Yes |
| ObjectID | int | ID atribuído pelo sistema ao objeto. Corresponde ao ID do Nó nos Showplans. | 22 | Yes |
| RequestID | int | ID do pedido que contém a declaração. | 49 | Yes |
| ServerName | nvarchar | Nome da instância do SQL Server que está sendo rastreada. | 26 | Não |
| SessionLoginName | nvarchar | Nome de login do usuário que originou a sessão. Por exemplo, se se ligar ao SQL Server usando o Login1 e executar uma instrução como Login2, o SessionLoginName mostra o Login1 e o LoginName mostra o Login2. Esta coluna exibe os logons do SQL Server e do Windows. | 64 | Yes |
| SPID | int | ID da sessão em que o evento ocorreu. | 12 | Yes |
| Horário de Início | datetime | Hora de início do evento, se disponível. | 14 | Yes |
| TransactionID | bigint | ID atribuída pelo sistema da transação. | 4 | Yes |
| XactSequence | bigint | Token que descreve a transação atual. | 50 | Yes |
Ver também
sp_trace_setevent (Transact-SQL)
Definir opções de índice
ALTERAR ÍNDICE (Transact-SQL)