Share via


Exchange Spill (Ereignisklasse)

Die Exchange Spill-Ereignisklasse gibt an, dass die Kommunikationspuffer in einem parallelen Abfrageplan vorübergehend in die tempdb-Datenbank geschrieben wurden. Dies tritt nur selten auf, und auch nur, wenn ein Abfrageplan mehrere Bereichsscans hat.

Normalerweise verfügt die Transact-SQL-Abfrage, die diese Bereichsscans generiert, über viele BETWEEN-Operatoren, wobei jeder dieser Operatoren einen Zeilenbereich aus einer Tabelle oder aus einem Index auswählt. Stattdessen können Sie mehrere Bereiche auch mithilfe von Ausdrücken abrufen, beispielsweise (T.a > 10 AND T.a < 20) OR (T.a > 100 AND T.a < 120). Darüber hinaus müssen die Abfragepläne erfordern, dass diese Bereiche der Reihenfolge nach gescannt werden. Dies geschieht aufgrund einer ORDER BY-Klausel für T.a oder weil ein Iterator im Plan erfordert, dass die Tupel in einer bestimmten Reihenfolge verwendet werden.

Wenn ein Abfrageplan für eine solche Abfrage mehrere Parallelism-Operatoren aufweist, werden die von den Parallelism-Operatoren verwendeten Speicherkommunikationspuffer vollständig gefüllt. Das kann dazu führen, dass der Ausführungsfortschritt der Abfrage beendet wird. In dieser Situation schreibt einer der Parallelism-Operatoren seinen Ausgabepuffer in tempdb (dieser Vorgang wird Austauschüberlauf genannt), damit Zeilen aus einigen seiner Eingabepuffer verwendet werden können. Letztendlich werden die übergelaufenen Zeilen wieder an den Consumer zurückgegeben, wenn dieser in der Lage ist, sie zu verarbeiten.

In seltenen Fällen können mehrere Austauschüberläufe innerhalb desselben Ausführungsplans auftreten, wodurch die Abfrage verlangsamt ausgeführt wird. Wenn Sie mehr als fünf Überläufe in der Ausführung desselben Abfrageplans feststellen, wenden Sie sich an einen Supportmitarbeiter.

Austauschüberläufe sind mitunter vorübergehend und sind möglicherweise nach geänderter Datenverteilung nicht mehr vorhanden.

Es gibt mehrere Möglichkeiten, Austauschüberläufe zu vermeiden:

  • Geben Sie die ORDER BY-Klausel nicht an, wenn das Resultset nicht sortiert vorliegen muss.

  • Wenn ORDER BY erforderlich ist, entfernen Sie die Spalte, die an mehreren Bereichsscans teilnimmt (T.a im oben angeführten Beispiel), aus der ORDER BY-Klausel.

  • Durch das Verwenden eines Indexhinweises wird der Optimierer gezwungen, für die betreffende Tabelle eine andere Zugriffsmethode zu verwenden.

  • Schreiben Sie die Abfrage neu, um einen anderen Abfrageausführungsplan zu erstellen.

  • Erzwingen Sie die serielle Ausführung der Abfrage, indem Sie die Option MAXDOP = 1 am Ende der Abfrage oder des Indexvorgangs hinzufügen. Weitere Informationen finden Sie unter max degree of parallelism (Option) und unter Konfigurieren von Parallelindexvorgänge.

Wichtiger HinweisWichtig

Zur Bestimmung der Stelle, an der das Exchange Spill-Ereignis auftritt, wenn der Abfrageoptimierer einen Ausführungsplan generiert, sollte Sie außerdem eine Showplan-Ereignisklasse in der Ablaufverfolgung sammeln. Sie können jede beliebige Showplan-Ereignisklasse auswählen, außer den Ereignisklassen Showplan Text und Showplan Text (Unencoded), da sie keine Knoten-ID zurückgeben. Knoten-IDs in Showplan-Ereignissen identifizieren jeden Vorgang, den der Abfrageoptimierer ausführt, wenn er einen Abfrageausführungsplan generiert. Diese Vorgänge werden Operatoren genannt, und jeder Operator in einem Showplan verfügt über eine Knoten-ID. Die ObjectID-Spalte für Exchange Spill-Ereignisse entspricht der Knoten-ID in Showplans, sodass Sie bestimmen können, welcher Operator oder Vorgang den Fehler verursacht. Weitere Informationen zu den Showplan-Ereignisklassen finden Sie unter Anzeigen von Ausführungsplänen mithilfe von SQL Server Profiler-Ereignisklassen.

Datenspalten für Exchange Spill-Ereignisklassen

Datenspaltenname

Datentyp

Beschreibung

Column ID

Filterbar

ApplicationName

nvarchar

Der Name der Clientanwendung, die die Verbindung mit einer Instanz von SQL Server hergestellt hat. Diese Spalte wird mit den Werten aufgefüllt, die von der Anwendung übergeben werden, und nicht mit dem angezeigten Namen des Programms.

10

Ja

ClientProcessID

int

Die ID, die vom Hostcomputer dem Prozess zugewiesen wird, in dem die Clientanwendung ausgeführt wird. Diese Datenspalte wird gefüllt, wenn der Client die Clientprozess-ID angibt.

9

Ja

DatabaseID

int

ID der Datenbank, die in der USE database-Anweisung angegeben wurde, bzw. die ID der Standarddatenbank, wenn für eine bestimmte Instanz keine USE database-Anweisung ausgegeben wurde. In SQL Server Profiler wird der Name der Datenbank angezeigt, 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

DatabaseName

nvarchar

Name der Datenbank, in der die Benutzeranweisung ausgeführt wird

35

Ja

EventClass

int

Ereignistyp = 127

27

Nein

EventSequence

int

Sequenz eines bestimmten Ereignisses innerhalb der Anforderung

51

Nein

EventSubClass

int

Typ der Ereignisunterklasse

1=Beginn des Überlaufs

2=Ende des Überlaufs

21

Ja

GroupID

int

ID der Arbeitsauslastungsgruppe, in der das SQL-Ablaufverfolgungsereignis ausgelöst wird.

66

Ja

HostName

nvarchar

Name des Computers, auf dem der Client ausgeführt wird. Diese Datenspalte wird gefüllt, wenn der Client den Hostnamen angibt. Der Hostname kann mithilfe der HOST_NAME-Funktion ermittelt werden.

8

Ja

IsSystem

int

Gibt an, ob das Ereignis bei einem Systemprozess oder bei einem Benutzerprozess aufgetreten ist. 1 = System, 0 = Benutzer.

60

Ja

LoginName

nvarchar

Anmeldename des Benutzers (Anmeldung der SQL Server-Sicherheit oder Windows-Anmeldeinformationen im Format <DOMAIN>\<username>).

11

Ja

LoginSid

image

Sicherheits-ID (Security Identification Number, SID) des angemeldeten Benutzers. Sie finden diese Informationen in der syslogins-Tabelle der master-Datenbank. Die SID ist für jede Anmeldung am Server eindeutig.

41

Ja

NTDomainName

nvarchar

Windows-Domäne, der der Benutzer angehört

7

Ja

NTUserName

nvarchar

Windows-Benutzername

6

Ja

ObjectID

int

Vom System zugewiesene ID des Objekts 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, für die eine Ablaufverfolgung ausgeführt wird

26

Nein

SessionLoginName

nvarchar

Der Anmeldename des Benutzers, der die Sitzung geöffnet hat. Wenn Sie beispielsweise Login1 dazu verwenden, eine Verbindung mit SQL Server herzustellen, und eine Anweisung als Login2 ausführen, zeigt SessionLoginName den Wert Login1 an, wogegen LoginName den Wert Login2 anzeigt. Diese Spalte zeigt sowohl den SQL Server- als auch den Windows-Anmeldenamen an.

64

Ja

SPID

int

ID der Sitzung, bei der das Ereignis aufgetreten ist

12

Ja

StartTime

datetime

Zeitpunkt, zu dem das Ereignis begonnen hat (falls verfügbar)

14

Ja

TransactionID

bigint

Vom System zugewiesene ID der Transaktion

4

Ja

XactSequence

bigint

Token, das die aktuelle Transaktion beschreibt

50

Ja