Condividi tramite


Classe di evento Hash Warning

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

È 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.

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. Se la memoria disponibile non è sufficiente per una delle partizioni, la partizione viene suddivisa ulteriormente in sottopartizioni che vengono elaborate separatamente. 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).

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. È in genere causato da dati asimmetrici.

Ricorsione di hash e hash bailout provocano una riduzione delle prestazioni del server. Per eliminare ricorsioni di hash e hash bailout o ridurne la frequenza, eseguire una delle operazioni seguenti:

  • Verificare che siano disponibili statistiche per le colonne da unire in join o raggruppare.

  • Se esistono statistiche per le colonne, aggiornarle.

  • Utilizzare un tipo di join diverso. Ad esempio, utilizzare un join MERGE o LOOP, se appropriato.

  • Aumentare la memoria disponibile nel 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.

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.

Nota

Per descrivere l'hash bailout vengono usati anche i termini grace hash join e hash join ricorsivo .

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. È 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. Nelle classi Showplan gli ID nodo identificano ogni operazione eseguita da Query Optimizer quando genera un piano di esecuzione della query. Queste operazioni sono denominate operatorie a ogni operatore presente in una classe Showplan è associato un ID nodo. 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.

Colonne di dati della classe di evento Hash Warning

Nome colonna di dati Tipo di dati Descrizione ID colonna Filtrabile
ApplicationName nvarchar Nome dell'applicazione client che ha creato 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 USE database oppure ID del database predefinito, se per una determinata istanza non viene eseguita un'istruzione USE database. SQL Server Profiler visualizza il nome del database se la colonna di dati ServerName è acquisita nella traccia e il server è disponibile. 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 = 55. 27 No
EventSequence int Sequenza di un determinato evento all'interno della richiesta. 51 No
EventSubClass int Tipo di sottoclasse di evento.

0=Ricorsione

1=Bailout
21
GroupID int ID del gruppo del carico di lavoro in cui viene generato l'evento di Traccia SQL. 66
HostName nvarchar Nome del computer in cui viene eseguito il client. Questa colonna di dati viene popolata se il client fornisce il nome host. Per determinare il nome host, usare la funzione HOST_NAME . 8
IntegerData int Livello di ricorsione (solo ricorsione di hash). 25
IsSystem int Indica se l'evento è stato generato per un processo di sistema o un processo utente. 1 = sistema, 0 = utente. 60
LoginName nvarchar Nome dell'account di accesso dell'utente (account di accesso di sicurezza di SQL Server o credenziali di accesso di Windows sotto forma di DOMINIO\nomeutente>).<>< 11
LoginSid Immagine ID di sicurezza (SID) dell'utente connesso. Queste informazioni sono disponibili nella vista del catalogo sys.server_principals. Il SID è univoco per ogni account di accesso nel server. 41
NTDomainName nvarchar Dominio Windows di appartenenza dell'utente. 7
NTUserName nvarchar Nome utente di Windows. 6
ObjectID int ID del nodo radice del gruppo di hash coinvolto nella ripartizione, 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
SessionLoginName nvarchar Nome dell'account di accesso dell'utente che ha avviato la sessione. Ad esempio, se ci si connette a SQL Server usando Login1 ed eseguire un'istruzione come Login2, SessionLoginName mostra Login1 e LoginName mostra Login2. In questa colonna vengono visualizzati sia gli account di accesso di SQL Server che 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

Vedi anche

sp_trace_setevent (Transact-SQL)
Join