Exchange Spill - classe di eventoExchange Spill Event Class

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 .The Exchange Spill event class indicates that communication buffers in a parallel query plan have been temporarily written to the tempdb database. Questa classe viene generata raramente e solo quando un piano di query include più analisi di intervalli.This occurs rarely and only when a query plan has multiple range scans.

In genere, la query Transact-SQLTransact-SQL che genera tali analisi di intervalli include molti operatori BETWEEN, ognuno dei quali seleziona un intervallo di righe di una tabella o di un indice.Normally, the Transact-SQLTransact-SQL query that generates such range scans has many BETWEEN operators, each of which selects a range of rows from a table or an index. 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).Alternatively, you can obtain multiple ranges using expressions such as (T.a > 10 AND T.a < 20) OR (T.a > 100 AND T.a < 120). I piani di query richiedono inoltre che l'analisi 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.Additionally, the query plans must require that these ranges be scanned in order either because there is an ORDER BY clause on T.a, or because an iterator within the plan requires that it consume the tuples in sorted order.

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 arresto dell'esecuzione della query.When a query plan for such a query has multiple Parallelism operators, the memory communication buffers used by the Parallelism operators become full, and a situation can arise whereby the query's execution progress stops. 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'uso delle righe di alcuni buffer di input.In this situation, one of the Parallelism operators writes its output buffer to tempdb (an operation called an exchange spill) so that it can consume rows from some of its input buffers. Infine, le righe di cui è stato eseguito lo spill vengono restituite al consumer quando questo è pronto per utilizzarle.Eventually, the spilled rows are returned to the consumer when the consumer is ready to consume them.

In rarissimi casi, è possibile che all'interno dello stesso piano di esecuzione vengano eseguiti più spill di scambio, causando un rallentamento della query.Very rarely, multiple exchange spills can occur within the same execution plan, causing the query to execute slowly. Se si nota che l'esecuzione dello stesso piano di query include più di cinque spill, contattare il supporto tecnico.If you notice more than five spills within the same query plan's execution, contact your support professional.

Talvolta, gli spill di scambio sono temporanei e possono interrompersi quando viene modificata la distribuzione dei dati.Exchange spills are sometimes transient and may disappear as data distribution changes.

Esistono diversi modi per evitare gli eventi di spill di scambio:There are several ways to avoid exchange spill events:

  • Omettere la clausola ORDER BY se non è necessario ordinare il set di risultati.Omit the ORDER BY clause if you do not need the result set to be ordered.

  • Se la clausola ORDER BY è necessaria, eliminare la colonna che partecipa a più analisi di intervalli (T.a nell'esempio precedente) da tale clausola.If ORDER BY is required, eliminate the column that participates in the multiple range scans (T.a in the example above) from the ORDER BY clause.

  • Mediante un hint per l'indice, forzare Query Optimizer a utilizzare un percorso di accesso diverso per la tabella in questione.Using an index hint, force the optimizer to use a different access path on the table in question.

  • Riscrivere la query per generare un piano di esecuzione diverso.Rewrite the query to produce a different query execution plan.

  • Forzare l'esecuzione seriale della query aggiungendo l'opzione MAXDOP = 1 alla fine della query o dell'operazione sull'indice.Force serial execution of the query by adding the MAXDOP = 1 option to the end of the query or index operation. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism e Configurare operazioni parallele sugli indici.For more information, see Configure the max degree of parallelism Server Configuration Option and Configure Parallel Index Operations.

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.To determine where the Exchange Spill event is occurring when the query optimizer generates an execution plan, you should also collect a Showplan event class in the trace. È possibile scegliere qualsiasi classe di evento Showplan ad eccezione delle classi di evento Showplan Text e Showplan Text (Unencoded) , poiché non consentono la restituzione di alcun ID nodo.You can choose any of the Showplan event classes except the Showplan Text and Showplan Text (Unencoded) event classes, which do not return a Node ID. Nelle classi Showplan gli ID nodo identificano ogni operazione eseguita da Query Optimizer quando genera un piano di esecuzione della query.Node IDs in Showplans identify each operation the query optimizer performs when it generates a query execution plan. Queste operazioni vengono denominate operatori e a ogni operatore presente in una classe Showplan è associato un ID nodo.These operations are called operators and each operator in a Showplan has a Node ID. La colonna ObjectID per gli eventi Exchange Spill corrisponde all'ID nodo nelle classi Showplan, in modo che sia possibile determinare l'operatore o l'operazione che sta provocando l'errore.The ObjectID column for Exchange Spill events corresponds to the Node ID in Showplans so you can determine which operator, or operation, is causing the error.

Colonne di dati della classe di evento Exchange SpillExchange Spill Event Class Data Columns

Nome colonna di datiData column name Tipo di datiData type DescrizioneDescription ID colonnaColumn ID FiltrabileFilterable
ApplicationNameApplicationName nvarcharnvarchar Nome dell'applicazione client in cui è stata creata la connessione a un'istanza di SQL ServerSQL Server.Name of the client application that created the connection to an instance of SQL ServerSQL Server. Questa colonna viene popolata con i valori passati dall'applicazione e non con il nome visualizzato del programma.This column is populated with the values passed by the application rather than the displayed name of the program. 1010 Yes
ClientProcessIDClientProcessID intint ID assegnato dal computer host al processo in cui è in esecuzione l'applicazione client.ID assigned by the host computer to the process where the client application is running. Questa colonna di dati viene popolata se tramite il client viene indicato l'ID del processo client.This data column is populated if the client provides the client process ID. 99 Yes
DatabaseIDDatabaseID intint ID del database specificato nell'istruzione di database USE oppure il database predefinito se per un'istanza specifica l'istruzione di database USE non è stata eseguita.ID of the database specified by the USE database statement or the default database if no USE database statement has been issued for a given instance. SQL Server ProfilerSQL Server Profiler visualizza il nome del database se la colonna di dati ServerName è acquisita nella traccia e il server è disponibile. displays the name of the database if the ServerName data column is captured in the trace and the server is available. Determinare il valore per un database utilizzando la funzione DB_ID.Determine the value for a database by using the DB_ID function. 33 Yes
DatabaseNameDatabaseName nvarcharnvarchar Nome del database nel quale viene eseguita l'istruzione dell'utente.Name of the database in which the user statement is running. 3535 Yes
EventClassEventClass intint Tipo di evento = 127.Type of event = 127. 2727 NoNo
EventSequenceEventSequence intint Sequenza di un determinato evento all'interno della richiesta.Sequence of a given event within the request. 5151 NoNo
EventSubClassEventSubClass intint Tipo di sottoclasse di evento.Type of event subclass.

1=Inizio dello spill1=Spill begin

2=Fine dello spill2=Spill end
2121 Yes
GroupIDGroupID intint ID del gruppo del carico di lavoro in cui viene generato l'evento di Traccia SQL.ID of the workload group where the SQL Trace event fires. 6666 Yes
HostNameHostName nvarcharnvarchar Nome del computer in cui viene eseguito il client.Name of the computer on which the client is running. Questa colonna di dati viene popolata se il client fornisce il nome host.This data column is populated if the client provides the host name. Per determinare il nome host, usare la funzione HOST_NAME.To determine the host name, use the HOST_NAME function. 88 Yes
IsSystemIsSystem intint Indica se l'evento è stato generato per un processo di sistema o un processo utente.Indicates whether the event occurred on a system process or a user process. 1 = sistema, 0 = utente.1 = system, 0 = user. 6060 Yes
LoginNameLoginName nvarcharnvarchar Nome dell'account di accesso dell'utente (account di sicurezza SQL ServerSQL Server o credenziali di accesso di Windows nel formato <DOMINIO>\<nomeutente>).Name of the login of the user (either SQL ServerSQL Server security login or the Windows login credentials in the form of <DOMAIN>\<username>). 1111 Yes
LoginSidLoginSid imageimage ID di sicurezza (SID) dell'utente connesso.Security identification number (SID) of the logged-in user. Tali informazioni sono disponibili nella tabella syslogins del database master .You can find this information in the syslogins table of the master database. Il SID è univoco per ogni account di accesso nel server.Each SID is unique for each login in the server. 4141 Yes
NTDomainNameNTDomainName nvarcharnvarchar Dominio Windows di appartenenza dell'utente.Windows domain to which the user belongs. 77 Yes
NTUserNameNTUserName nvarcharnvarchar Nome utente di Windows.Windows user name. 66 Yes
ObjectIDObjectID intint ID dell'oggetto assegnato dal sistema.System-assigned ID of the object. Corrisponde al nodo di ID nelle classi di evento Showplan.Corresponds with the Node ID in Showplans. 2222 Yes
RequestIDRequestID intint ID della richiesta contenente l'istruzione.ID of the request containing the statement. 4949 Yes
ServerNameServerName nvarcharnvarchar Nome dell'istanza di SQL ServerSQL Server tracciata.Name of the instance of SQL ServerSQL Server being traced. 2626 NoNo
SessionLoginNameSessionLoginName nvarcharnvarchar Nome dell'account di accesso dell'utente che ha avviato la sessione.Login name of the user who originated the session. Se ad esempio si stabilisce la connessione a SQL ServerSQL 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.For example, if you connect to SQL ServerSQL Server using Login1 and execute a statement as Login2, SessionLoginName shows Login1 and LoginName shows Login2. In questa colonna sono visualizzati sia gli account di accesso di SQL ServerSQL Server che quelli di Windows.This column displays both SQL ServerSQL Server and Windows logins. 6464 Yes
SPIDSPID intint ID della sessione in cui si è verificato l'evento.ID of the session on which the event occurred. 1212 Yes
StartTimeStartTime datetimedatetime Ora di inizio dell'evento, se disponibile.Time at which the event started, if available. 1414 Yes
TransactionIDTransactionID bigintbigint ID della transazione assegnato dal sistema.System-assigned ID of the transaction. 44 Yes
XactSequenceXactSequence bigintbigint Token utilizzato per descrivere la transazione corrente.Token that describes the current transaction. 5050 Yes

Vedere ancheSee Also

sp_trace_setevent (Transact-SQL) sp_trace_setevent (Transact-SQL)
Impostare le opzioni di indice Set Index Options
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)