Freigeben über


Logische und physikalische Operatoren (Referenz)

Operatoren beschreiben, wie eine Abfrage oder eine DML-Anweisung (Data Manipulation Language) in SQL Server ausgeführt wird. Der Abfrageoptimierer verwendet Operatoren, um einen Abfrageplan für das in der Abfrage angegebene Ergebnis zu erstellen, oder zum Ausführen des in der DML-Anweisung angegebenen Vorgangs. Der Abfrageplan ist eine Struktur, die aus physikalischen Operatoren besteht.

Operatoren werden als logische und physikalische Operatoren klassifiziert. Logische Operatoren beschreiben einen relationalen Abfrageverarbeitungsvorgang auf konzeptioneller Ebene. Physikalische Operatoren implementieren im Grunde den durch einen logischen Operator definierten Vorgang mithilfe einer konkreten Methode oder eines Algorithmus. Ein logischer Vorgang ist z. B. "Join", wogegen "Nested Loops Joins" ein physikalischer Operator ist.

  • Logische Operatoren
    Logische Operatoren beschreiben den relationalen algebraischen Vorgang, der für die Anweisungsverarbeitung verwendet wird. Mit anderen Worten, logische Operatoren beschreiben konzeptionell den auszuführenden Vorgang.

  • Physikalische Operatoren
    Physikalische Operatoren implementieren den durch logische Operatoren beschriebenen Vorgang. Jeder physikalische Operator ist ein Objekt oder eine Routine, das bzw. die einen Vorgang ausführt. Einige Operatoren greifen z. B. auf Spalten oder Zeilen einer Tabelle, eines Index oder einer Sicht zu. Andere physikalische Operatoren führen andere Arten von Vorgängen aus: Der Aggregate-Operator berechnet einen Ausdruck, der MIN, MAX, SUM, COUNT oder AVG enthält, und der Merge Join-Operator führt verschiedene Arten von logischen Verknüpfungsvorgängen aus.

    Über die physikalischen Operatoren werden Daten initialisiert, aufgelistet und beendet. Der physikalische Operator kann insbesondere die folgenden drei Methodenaufrufe beantworten:

    • Init(): Mit der Init()-Methode wird ein physikalischer Operator initialisiert und dazu angewiesen, gegebenenfalls Datenstrukturen einzurichten. Der physikalische Operator kann mehrere Init()-Aufrufe empfangen; in der Regel empfängt er jedoch nur einen.

    • GetNext(): Mit der GetNext()-Methode wird ein Operator angewiesen, die erste oder nächste Datenzeile abzurufen. Der physikalische Operator kann null oder mehrere GetNext()-Aufrufe empfangen.

    • Close(): Mit der Close()-Methode wird der physikalische Operator dazu angewiesen, einige Cleanupvorgänge auszuführen und sich selbst zu beenden. Ein physikalischer Operator empfängt nur einen Close()-Aufruf.

Die GetNext()-Methode gibt eine Datenzeile zurück, und die Anzahl der Aufrufe wird als ActualRows in der durch SET STATISTICS PROFILE ON oder SET STATISTICS XML ON erstellten Showplanausgabe angezeigt. Weitere Informationen zu diesen SET-Optionen finden Sie unter SET STATISTICS PROFILE (Transact-SQL) und SET STATISTICS XML (Transact-SQL).

Die ActualRebinds- und ActualRewinds-Zähler, die in der Showplanausgabe angezeigt werden, beziehen sich auf die Anzahl der Aufrufe der Init()-Methode. ActualRebinds entspricht 1 und ActualRewinds entspricht 0, es sei denn, ein Operator befindet sich innerhalb einer Schleifenverknüpfung. Wenn sich ein Operator innerhalb einer Schleifenverknüpfung befindet, muss die Summe der erneuten Bindungen und Zurückspulvorgänge der Anzahl der verarbeiteten Vorgänge außerhalb der Verknüpfung entsprechen. Unter 'erneuter Bindung' wird verstanden, dass sich mindestens ein korrelierter Parameter der Verknüpfung geändert hat und daher das Innere der Verknüpfung neu ausgewertet werden muss. Unter 'Zurückspulvorgang' wird verstanden, dass sich keiner der korrelierten Parameter geändert hat und das vorherige innere Resultset daher wiederverwendet werden kann.

ActualRebinds und ActualRewinds sind in der mithilfe von SET STATISTICS XML ON erstellten XML-Showplanausgabe vorhanden. Sie werden nur für die Operatoren Nonclustered Index Spool, Remote Query, Row Count Spool, Sort, Table Spool und Table-valued Function aufgefüllt. ActualRebinds und ActualRewinds können auch für den Assert- und den Filter-Operator aufgefüllt werden, wenn das StartupExpression-Attribut auf TRUE festgelegt ist.

Wenn ActualRebinds und ActualRewinds in einem XML-Showplan vorhanden sind, können sie mit EstimateRebinds und EstimateRewinds verglichen werden. Wenn sie nicht vorhanden sind, kann die geschätzte Zeilenanzahl (EstimateRows) mit der tatsächlichen Zeilenanzahl (ActualRows) verglichen werden. Beachten Sie, dass die tatsächliche grafische Showplanausgabe für tatsächliche erneute Bindungen und Zurückspulvorgänge Nullen anzeigt, wenn letztere nicht vorhanden sind. Weitere Informationen zu grafischen Showplans finden Sie unter Anzeigen von grafischen Ausführungsplänen (SQL Server Management Studio).

Ein entsprechender Zähler, ActualEndOfScans, ist verfügbar, wenn die Showplanausgabe mithilfe von SET STATISTICS XML ON erstellt wird. Wenn ein physikalischer Operator das Ende seines Datenstroms erreicht, wird dieser Zähler um 1 erhöht. Wenn ein physikalischer Operator das Ende seines Datenstroms erreicht, wird dieser Zähler um 1 erhöht. Wie bei erneuten Bindungen und Zurückspulvorgängen kann die Anzahl für das Scanende größer als 1 sein; aber nur, wenn sich der Operator innerhalb einer Schleifenverknüpfung befindet. Die Anzahl für Scanende muss kleiner oder gleich der Summe der erneuten Bindungen und Zurückspulvorgänge sein.

Physikalische Operatoren entsprechen den Ausführungsalgorithmen. Zu den physikalischen Operatoren zählen u. a. Index Scan/Seek, Nested Loop Join, Merge Join, Hash Join/Aggregation und Stream Aggregation. Physikalischen Operatoren sind Kosten zugeordnet. Bei der Ausführung einer Abfrage oder einer DML-Anweisung schließt jeder Schritt einen physikalischen Operator ein.

Zuordnen von physikalischen und logischen Operatoren

Der Abfrageoptimierer erstellt einen Abfrageplan als Struktur, die aus logischen Operatoren besteht. Nach dem Erstellen des Abfrageplans wählt der Abfrageoptimierer für jeden logischen Operator den effizientesten physikalischen Operator aus. Der Abfrageoptimierer entscheidet auf Basis der Kosten, welcher physikalischer Operator einen logischen Operator implementieren soll.

Normalerweise kann ein logischer Vorgang von mehreren physikalischen Operatoren implementiert werden. Ein physikalischer Operator kann jedoch in seltenen Fällen mehrere logische Vorgänge implementieren.

In diesem Abschnitt

In diesem Abschnitt finden Sie Beschreibungen der folgenden logischen und physikalischen Operatoren:

Aggregate

Merge Interval

Arithmetic Expression

Merge Join

Assert

Nested Loops

Assign

Nonclustered Index Delete

Async Concat

Nonclustered Index Insert

Bitmap

Nonclustered Index Scan

Bitmap Create

Nonclustered Index Seek

Bookmark Lookup

Nonclustered Index Spool

Branch Repartition

Nonclustered Index Update

Broadcast

Online Index Insert

Cache

Parallelism

Clustered Index Delete

Parameter Table Scan

Clustered Index Insert

Partial Aggregate

Clustered Index Merge

Population Query

Clustered Index Scan

Refresh Query

Clustered Index Seek

Remote Delete

Clustered Index Update

Remote Index Scan

Collapse

Remote Index Seek

Compute Scalar

Remote Insert

Concatenation

Remote Query

Constant Scan

Remote Scan

Convert

Remote Update

Cross Join

Repartition Streams

Cursor Catchall

Result

Declare

RID Lookup

Delete

Right Anti Semi Join

Deleted Scan

Right Outer Join

Distinct

Right Semi Join

Distinct Sort

Row Count Spool

Distribute Streams

Segment

Dynamic

Segment Repartition

Eager Spool

Sequence

Fetch Query

SequenceProject

Filter

Snapshot

Flow Distinct

Sort

Full Outer Join

Split

Gather Streams

Spool

Hash Match

Stream Aggregate

Hash Match Root

Switch

Hash Match Team

Table Delete

If

Table Insert

Inner Join

Table Merge

Insert

Table Scan

Inserted Scan

Table Spool

Intrinsic

Table Update

Iterator Catchall

Tabellenwertfunktion

Key Lookup

Top

Keyset

Top N Sort

Language Element Catchall

UDX

Lazy Spool

Union

Left Anti Semi Join

Update

Left Outer Join

While

Left Semi Join

Logische und physikalische Cursoroperatoren

Log Row Scan