Freigeben über


Hash-Warnereignis-Klasse

Die Ereignisklasse "Hashwarnung" kann verwendet werden, um zu überwachen, wann während eines Hashvorgangs eine Hash-Rekursion oder beendigung des Hashings (Hash-Bailout) aufgetreten ist.

Hash-Rekursion tritt auf, wenn die Buildeingabe nicht in den verfügbaren Speicher passt, was dazu führt, dass die Eingabe in mehrere Partitionen aufgeteilt wird, die separat verarbeitet werden. Wenn eine dieser Partitionen immer noch nicht in den verfügbaren Speicher passt, wird sie in Unterpartitionen aufgeteilt, die ebenfalls separat verarbeitet werden. Dieser Aufteilungsprozess wird fortgesetzt, bis jede Partition in den verfügbaren Speicher passt oder bis die maximale Rekursionsstufe erreicht ist (in der Datenspalte integerData angezeigt).

Hash-Bailout tritt auf, wenn ein Hashing-Vorgang seine maximale Rekursionsebene erreicht und zu einem alternativen Plan wechselt, um die verbleibenden partitionierten Daten zu verarbeiten. Hash-Bailout tritt in der Regel aufgrund verzerrter Daten auf.

Hash-Rekursion und Hash-Bailout führen zu einer verringerten Leistung auf Ihrem Server. Führen Sie eine der folgenden Aktionen aus, um die Häufigkeit von Hash rekursion und Bailouts zu beseitigen oder zu verringern:

  • Stellen Sie sicher, dass Statistiken für die Spalten vorhanden sind, die verknüpft oder gruppiert werden.

  • Wenn Statistiken für die Spalten vorhanden sind, aktualisieren Sie sie.

  • Verwenden Sie einen anderen Verknüpfungstyp. Verwenden Sie beispielsweise stattdessen eine MERGE- oder LOOP-Verknüpfung, wenn dies angemessen ist.

  • Erhöhen Sie den verfügbaren Arbeitsspeicher auf dem Computer. Hash-Rekursion oder Bailout tritt auf, wenn nicht genügend Arbeitsspeicher zum Verarbeiten von Abfragen vorhanden ist und sie auf den Datenträger überlaufen müssen.

Das Erstellen oder Aktualisieren der Statistiken zu der Spalte, die an der Verknüpfung beteiligt ist, ist die effektivste Möglichkeit, die Anzahl der Hash-Rekursionen oder Rettungsaktionen zu reduzieren, die auftreten.

Hinweis

Die Begriffe Grace Hash Join und rekursiver Hash Join werden auch verwendet, um das Hash-Bailout zu beschreiben.

Von Bedeutung

Um zu ermitteln, wo das Hash-Warnungsereignis auftritt, wenn der Abfrageoptimierer einen Ausführungsplan generiert, sollten Sie auch eine Showplan-Ereignisklasse im Trace erfassen. Sie können eine der Showplan-Ereignisklassen mit Ausnahme der Showplan-Ereignisklassen "Text" und "Uncodiert" auswählen, die keine Knoten-ID zurückgeben. Knoten-IDs in Showplans identifizieren jeden Vorgang, den der Abfrageoptimierer beim Generieren eines Abfrageausführungsplans ausführt. Diese Vorgänge werden als Operatoren bezeichnet, und jeder Operator in einem Showplan verfügt über eine Knoten-ID. Die ObjectID-Spalte für Hashwarnungsereignisse entspricht der Knoten-ID in Showplans, sodass Sie bestimmen können, welcher Operator oder Vorgang den Fehler verursacht.

Datenkolonnen der Ereignisklasse für Hash-Warnungen

Datenspaltenname Datentyp BESCHREIBUNG Spalten-ID Filterbar
Anwendungsname nvarchar Name der Clientanwendung, die die Verbindung mit einer Instanz von SQL Server erstellt hat. Diese Spalte wird nicht mit dem angezeigten Namen des Programms, sondern mit den Werten gefüllt, die von der Anwendung übergeben werden. 10 Ja
ClientProcessID int Die ID, die der Hostcomputer dem Prozess zuweist, in dem die Clientanwendung ausgeführt wird. Diese Datenspalte wird ausgefüllt, wenn der Client eine Clientprozess-ID bereitstellt. 9 Ja
Datenbank-ID int Die ID der Datenbank, die durch die USE database -Anweisung angegeben wurde, bzw. die ID der Standarddatenbank, wenn für eine bestimmte Instanz keine USE database -Anweisung ausgegeben wurde. SQL Server Profiler zeigt den Namen der Datenbank an, wenn die ServerName -Datenspalte in der Ablaufverfolgung aufgezeichnet wird und der Server verfügbar ist. Der Wert für eine Datenbank kann mithilfe der DB_ID-Funktion ermittelt werden. 3 Ja
Datenbankname nvarchar Name der Datenbank, in der die Benutzeranweisung ausgeführt wird. 35 Ja
EventClass int Ereignistyp = 55. 27 Nein
Ereignisfolge int Sequenz eines bestimmten Ereignisses innerhalb der Anforderung. 51 Nein
EreignisUnterklasse int Der Typ der Ereignisunterklasse.

0=Rekursion

1=Bailout
21 Ja
Gruppen-ID int ID der Arbeitsauslastungsgruppe, in der das SQL-Ablaufverfolgungsereignis ausgelöst wird. 66 Ja
Hostname (Rechnername) nvarchar Der Name des Computers, auf dem der Client ausgeführt wird. Diese Datenspalte wird aufgefüllt, wenn der Hostname vom Client bereitgestellt wird. Verwenden Sie die HOST_NAME -Funktion, um den Hostnamen zu bestimmen. 8 Ja
IntegerData int Rekursionsebene (nur Hash-Rekursion). 25 Ja
IsSystem int Gibt an, ob das Ereignis bei einem Systemprozess oder einem Benutzerprozess aufgetreten ist. 1 = System, 0 = Benutzer. 60 Ja
Anmeldename nvarchar Name der Anmeldung des Benutzers (entweder SQL Server-Sicherheitsanmeldung oder Windows-Anmeldeinformationen in Form von <DOMÄNE>\<Benutzername>). 11 Ja
LoginSid image Sicherheits-ID (SID) des angemeldeten Benutzers. Diese Informationen finden Sie in der sys.server_principals-Katalogsicht. Die SID ist für jede Anmeldung beim Server eindeutig. 41 Ja
NT-Domänenname nvarchar Windows-Domäne, zu der der Benutzer gehört. 7 Ja
NTUserName nvarchar Windows-Benutzername. 6 Ja
Objekt-ID int Knoten-ID der Wurzel des Hashteams, das an der Neuaufteilung beteiligt ist. Entspricht der Knoten-ID in Showplans. 22 Ja
RequestID int ID der Anforderung, die die Anweisung enthält. 49 Ja
Servername nvarchar Name der Instanz von SQL Server, die nachverfolgt wird. 26
SessionLoginName nvarchar Der Anmeldename des Benutzers, der die Sitzung gestartet hat. Wenn Sie beispielsweise mithilfe von Login1 eine Verbindung mit SQL Server herstellen und eine Anweisung als Login2 ausführen, zeigt SessionLoginName "Login1" und "LoginName" "Login2" an. In dieser Spalte werden sowohl SQL Server- als auch Windows-Anmeldungen angezeigt. 64 Ja
SPID int Die ID der Sitzung, in der das Ereignis aufgetreten ist. 12 Ja
Startzeit datetime Zeitpunkt, zu dem das Ereignis begonnen hat (falls vorhanden). 14 Ja
TransactionID bigint Die vom System zugewiesene ID der Transaktion. 4 Ja
XactSequence bigint Das Token, das die aktuelle Transaktion beschreibt. 50 Ja

Siehe auch

sp_trace_setevent (Transact-SQL)