Hash Warning - classe di eventoHash Warning Event Class

È possibile utilizzare la classe di evento Hash Warning per monitorare il momento in cui si verifica una ricorsione di hash o l'interruzione dell'hashing (hash bailout) durante un'operazione di hashing.The Hash Warning event class can be used to monitor when a hash recursion or cessation of hashing (hash bailout) has occurred during a hashing operation.

La ricorsione di hash si verifica quando la memoria disponibile non è sufficiente per l'input di compilazione, che viene quindi suddiviso in più partizioni elaborate separatamente.Hash recursion occurs when the build input does not fit into available memory, resulting in the split of input into multiple partitions that are processed separately. Se la memoria disponibile non è sufficiente per una delle partizioni, la partizione viene suddivisa ulteriormente in sottopartizioni che vengono elaborate separatamente.If any of these partitions still do not fit into available memory, it is split into subpartitions, which are also processed separately. Il processo di suddivisione continua fino a quando non vengono inserite nella memoria disponibile tutte le partizioni o non viene raggiunto il livello massimo di ricorsione (visualizzato nella colonna di dati IntegerData).This splitting process continues until each partition fits into available memory or until the maximum recursion level is reached (displayed in the IntegerData data column).

L'evento hash bailout si verifica quando un'operazione di hashing raggiunge il livello massimo di ricorsione e ricorre a un piano alternativo per l'elaborazione dei dati partizionati rimanenti.Hash bailout occurs when a hashing operation reaches its maximum recursion level and shifts to an alternate plan to process the remaining partitioned data. È in genere causato da dati asimmetrici.Hash bailout usually occurs because of skewed data.

Ricorsione di hash e hash bailout provocano una riduzione delle prestazioni del server.Hash recursion and hash bailout cause reduced performance in your server. Per eliminare ricorsioni di hash e hash bailout o ridurne la frequenza, eseguire una delle operazioni seguenti:To eliminate or reduce the frequency of hash recursion and bailouts, do one of the following:

  • Verificare che siano disponibili statistiche per le colonne da unire in join o raggruppare.Make sure that statistics exist on the columns that are being joined or grouped.

  • Se esistono statistiche per le colonne, aggiornarle.If statistics exist on the columns, update them.

  • Utilizzare un tipo di join diverso.Use a different type of join. Ad esempio, utilizzare un join MERGE o LOOP, se appropriato.For example, use a MERGE or LOOP join instead, if appropriate.

  • Aumentare la memoria disponibile nel computer.Increase available memory on the computer. Ricorsione di hash e hash bailout si verificano quando non è disponibile memoria sufficiente per l'elaborazione delle query e si rende necessaria la scrittura su disco.Hash recursion or bailout occurs when there is not enough memory to process queries in place and they need to spill to disk.

    La creazione o l'aggiornamento delle statistiche per le colonne interessate dall'operazione di join è la procedura più efficace per ridurre il numero di ricorsioni di hash e hash bailout.Creating or updating the statistics on the column involved in the join is the most effective way to reduce the number of hash recursion or bailouts that occur.

Nota

Per descrivere l'hash bailout vengono usati anche i termini grace hash join e hash join ricorsivo .The terms grace hash join and recursive hash join are also used to describe hash bailout.

Importante

Per determinare la posizione in cui si verifica l'evento Hash Warning quando Query Optimizer genera un piano di esecuzione, è inoltre consigliabile acquisire una classe di evento Showplan nella traccia.To determine where the Hash Warning 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 Showplan Text e Showplan Text (Unencoded) che non restituiscono 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 sono denominate operatorie 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 relativa agli eventi Hash Warning corrisponde così 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 Hash Warning 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 Hash WarningHash Warning 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 anziché con il nome visualizzato del programma.This column is populated with the values passed by the application rather than with 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 il client fornisce l'ID del processo client.This data column is populated if the client provides a 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 = 55.Type of event = 55. 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.

0=Ricorsione0=Recursion

1=Bailout1=Bailout
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
IntegerDataIntegerData intint Livello di ricorsione (solo ricorsione di hash).Recursion level (hash recursion only). 2525 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. Queste informazioni sono disponibili nella vista del catalogo sys.server_principals.You can find this information in the sys.server_principals catalog view. 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 del nodo radice del gruppo di hash coinvolto nella ripartizione,Node ID of the root of the hash team involved in the repartition. 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 that contains the statement. 4949 Yes
ServerNameServerName nvarcharnvarchar Nome dell'istanza di SQL ServerSQL Server tracciata.Name of the instance of SQL ServerSQL Server that is being traced. 2626
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)