Partilhar via


Classe de evento de sobrecarga do Exchange

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase 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)