Classe di evento Exchange Spill

La classe di evento Exchange Spill indica che i buffer di comunicazione in un piano di query parallele sono stati inseriti temporaneamente nel database tempdb. Questa classe viene generata raramente e solo quando un piano di query include più scansioni di intervalli.

In genere, la query Transact-SQL che genera tali scansioni di intervalli include molti operatori BETWEEN, ognuno dei quali seleziona un intervallo di righe di una tabella o di un indice. In alternativa, è possibile ottenere più intervalli utilizzando espressioni, ad esempio (T.a > 10 AND T.a < 20) OR (T.a > 100 AND T.a < 120). I piani di query richiedono inoltre che la scansione di tali intervalli venga eseguita in ordine perché esiste una clausola ORDER BY relativa a T.a oppure perché un iteratore all'interno del piano richiede che le tuple vengano utilizzate in base all'ordinamento stabilito.

Quando un piano relativo a tale query include più operatori Parallelism, i buffer di comunicazione della memoria utilizzati dagli operatori Parallelism si riempiono, con conseguente interruzione dell'esecuzione della query. In questo caso, uno degli operatori Parallelism inserisce il buffer di output in tempdb mediante un'operazione denominata spill di scambio, in modo da consentire l'utilizzo delle righe di alcuni buffer di input. Infine, le righe di cui è stato eseguito lo spill vengono restituite al consumer quando questo è pronto per utilizzarle.

In rarissimi casi, è possibile che all'interno dello stesso piano di esecuzione vengano eseguiti più spill di scambio, causando un rallentamento della query. Se si nota che l'esecuzione dello stesso piano di query include più di cinque spill, contattare il supporto tecnico.

Talvolta, gli spill di scambio sono temporanei e possono interrompersi quando viene modificata la distribuzione dei dati.

Esistono diversi modi per evitare gli eventi di spill di scambio:

  • Omettere la clausola ORDER BY se non è necessario ordinare il set di risultati.

  • Se la clausola ORDER BY è necessaria, eliminare la colonna che partecipa a più scansioni di intervalli (T.a nell'esempio precedente) da tale clausola.

  • Mediante un hint per l'indice, forzare Query Optimizer a utilizzare un percorso di accesso diverso per la tabella in questione.

  • Riscrivere la query per generare un piano di esecuzione diverso.

  • Forzare l'esecuzione seriale della query aggiungendo l'opzione MAXDOP = 1 alla fine della query o dell'operazione sull'indice. Per ulteriori informazioni, vedere Opzione max degree of parallelism e Configurazione di operazioni a indici paralleli.

Nota importanteImportante

Per determinare la posizione in cui si verifica l'evento Exchange Spill quando Query Optimizer genera un piano di esecuzione, è inoltre consigliabile acquisire una classe di evento Showplan nella traccia. È possibile scegliere qualsiasi classe di evento Showplan, ad eccezione delle classi di evento Showplan Text e Showplan Text (Unencoded) che non restituiscono un ID nodo. All'interno delle classi di evento Showplan gli ID nodo identificano tutte le operazioni eseguite da Query Optimizer durante la generazione di un piano di esecuzione delle query. Queste operazioni vengono definite operatori e a ogni operatore in una classe di evento Showplan è associato un ID di nodo. La colonna ObjectID per gli eventi Exchange Spill corrisponde all'ID di nodo contenuto nelle classi di evento Showplan, in modo che sia possibile determinare l'operatore o l'operazione che causa l'errore. Per ulteriori informazioni sulle classi di evento Showplan, vedere Visualizzazione dei piani di esecuzione utilizzando le classi di eventi di SQL Server Profiler.

Colonne di dati della classe di evento Exchange Spill

Nome colonna di dati

Tipo di dati

Descrizione

ID colonna

Filtrabile

ApplicationName

nvarchar

Nome dell'applicazione client in cui è stata creata la connessione a un'istanza di SQL Server. Questa colonna viene popolata con i valori passati dall'applicazione anziché con il nome visualizzato del programma.

10

ClientProcessID

int

ID assegnato dal computer host al processo in cui è in esecuzione l'applicazione client. Questa colonna di dati viene popolata se il client fornisce l'ID del processo client.

9

DatabaseID

int

ID del database specificato nell'istruzione di database USE oppure ID del database predefinito, se per una determinata istanza non viene eseguita un'istruzione di database USE. In SQL Server Profiler viene visualizzato il nome del database se la colonna di dati ServerName viene acquisita nella traccia e il server è disponibile. È possibile determinare il valore per un database utilizzando la funzione DB_ID.

3

DatabaseName

nvarchar

Nome del database nel quale viene eseguita l'istruzione dell'utente.

35

EventClass

int

Tipo di evento = 127.

27

No

EventSequence

int

Sequenza di un determinato evento nella richiesta.

51

No

EventSubClass

int

Tipo di sottoclasse di evento.

1=Inizio dello spill

2=Fine dello spill

21

GroupID

int

ID del gruppo del carico di lavoro dove l'evento Traccia SQL provoca l'attivazione.

66

HostName

nvarchar

Nome del computer in cui è in esecuzione il client. Questa colonna di dati viene popolata se il client fornisce il nome host. Per determinare il nome host, utilizzare la funzione HOST_NAME.

8

IsSystem

int

Indica se l'evento si è verificato in un processo di sistema o in un processo utente. 1 = sistema, 0 = utente.

60

LoginName

nvarchar

Nome dell'account di accesso dell'utente (account di accesso di protezione di SQL Server o credenziali di accesso di Windows nel formato <DOMAIN>\<username>).

11

LoginSid

image

ID di protezione (SID) dell'utente connesso. Tali informazioni sono disponibili nella tabella syslogins del database master. Il SID è univoco per ogni account di accesso nel server.

41

NTDomainName

nvarchar

Dominio di Windows a cui appartiene l'utente.

7

NTUserName

nvarchar

Nome utente di Windows.

6

ObjectID

int

ID dell'oggetto assegnato dal sistema. Corrisponde al nodo di ID nelle classi di evento Showplan.

22

RequestID

int

ID della richiesta contenente l'istruzione.

49

ServerName

nvarchar

Nome dell'istanza di SQL Server tracciata.

26

No

SessionLoginName

nvarchar

Nome dell'account di accesso dell'utente che ha avviato la sessione. Se ad esempio si stabilisce la connessione a SQL Server con l'account di accesso Login1 e si esegue un'istruzione con l'account di accesso Login2, SessionLoginName indica Login1 e LoginName indica Login2. In questa colonna vengono visualizzati sia gli account di accesso di SQL Server che quelli di Windows.

64

SPID

int

ID della sessione in cui si è verificato l'evento.

12

StartTime

datetime

Ora di inizio dell'evento, se disponibile.

14

TransactionID

bigint

ID della transazione assegnato dal sistema.

4

XactSequence

bigint

Token utilizzato per descrivere la transazione corrente.

50