Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 |