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.
Importante |
---|
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 |
Sì |
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 |
Sì |
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 |
Sì |
DatabaseName |
nvarchar |
Nome del database nel quale viene eseguita l'istruzione dell'utente. |
35 |
Sì |
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 |
Sì |
GroupID |
int |
ID del gruppo del carico di lavoro dove l'evento Traccia SQL provoca l'attivazione. |
66 |
Sì |
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 |
Sì |
IsSystem |
int |
Indica se l'evento si è verificato in un processo di sistema o in un processo utente. 1 = sistema, 0 = utente. |
60 |
Sì |
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 |
Sì |
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 |
Sì |
NTDomainName |
nvarchar |
Dominio di Windows a cui appartiene l'utente. |
7 |
Sì |
NTUserName |
nvarchar |
Nome utente di Windows. |
6 |
Sì |
ObjectID |
int |
ID dell'oggetto assegnato dal sistema. Corrisponde al nodo di ID nelle classi di evento Showplan. |
22 |
Sì |
RequestID |
int |
ID della richiesta contenente l'istruzione. |
49 |
Sì |
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 |
Sì |
SPID |
int |
ID della sessione in cui si è verificato l'evento. |
12 |
Sì |
StartTime |
datetime |
Ora di inizio dell'evento, se disponibile. |
14 |
Sì |
TransactionID |
bigint |
ID della transazione assegnato dal sistema. |
4 |
Sì |
XactSequence |
bigint |
Token utilizzato per descrivere la transazione corrente. |
50 |
Sì |
Vedere anche