Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist der Unterschied zwischen einem Tabellen-Scan und einem Clustered-Index-Scan?

In einer Tabelle ohne gruppierten Index (einer Heap-Tabelle) sind Datenseiten nicht miteinander verknüpft – daher erfordert das Durchlaufen von Seiten einen Schauen Sie in der Indexzuordnungskarte nach .

Bei einer gruppierten Tabelle sind die Datenseiten jedoch in einer doppelt verknüpften Liste verknüpft - sequentielle Scans etwas schneller machen. Im Gegenzug haben Sie natürlich den Aufwand, die Datenseiten bei INSERT in Ordnung zu halten , UPDATE , und DELETE . Eine Heap-Tabelle erfordert jedoch einen zweiten Schreibvorgang in das IAM.

Wenn Ihre Abfrage einen RANGE hat Operator (zB:SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100 ), dann wäre eine gruppierte Tabelle (in einer garantierten Reihenfolge) effizienter, da sie die Indexseiten verwenden könnte, um die relevanten Datenseiten zu finden. Ein Heap müsste alle Zeilen scannen, da er sich nicht auf eine Reihenfolge verlassen kann.

Und natürlich ermöglicht Ihnen ein geclusterter Index einen CLUSTERED INDEX SEEK, was für die Leistung ziemlich optimal ist ... ein Heap ohne Indizes würde immer zu einem Tabellenscan führen.

Also:

  • Für Ihre Beispielabfrage, bei der Sie alle Zeilen auswählen, besteht der einzige Unterschied in der doppelt verknüpften Liste, die ein Clustered-Index verwaltet. Dadurch sollte Ihre gruppierte Tabelle nur ein kleines bisschen schneller sein als ein Heap mit einer großen Anzahl von Zeilen.

  • Für eine Abfrage mit einem WHERE -Klausel, die (zumindest teilweise) durch den Clustered-Index erfüllt werden kann, haben Sie aufgrund der Reihenfolge die Nase vorn - Sie müssen also nicht die gesamte Tabelle scannen.

  • Bei einer Abfrage, die nicht durch den gruppierten Index erfüllt wird, sind Sie ziemlich ausgeglichen ... wieder, der einzige Unterschied besteht in dieser doppelt verknüpften Liste für sequenzielles Scannen. In beiden Fällen sind Sie suboptimal.

  • Für INSERT , UPDATE , und DELETE ein Haufen kann gewinnen oder nicht. Der Heap muss die Ordnung nicht aufrechterhalten, erfordert jedoch einen zweiten Schreibvorgang in das IAM. Ich denke, der relative Leistungsunterschied wäre vernachlässigbar, aber auch ziemlich datenabhängig.

Microsoft hat ein Whitepaper der einen geclusterten Index mit einem äquivalenten nicht geclusterten Index auf einem Heap vergleicht (nicht genau derselbe wie oben beschrieben, aber nahe dran). Ihre Schlussfolgerung besteht im Wesentlichen darin, einen gruppierten Index auf alle Tabellen zu setzen. Ich werde mein Bestes tun, um ihre Ergebnisse zusammenzufassen (beachten Sie noch einmal, dass sie hier wirklich einen nicht geclusterten Index mit einem geclusterten Index vergleichen - aber ich denke, es ist relativ vergleichbar):

  • INSERT Leistung:Der gruppierte Index gewinnt um etwa 3 %, da der zweite Schreibvorgang für einen Heap erforderlich ist.
  • UPDATE Leistung:Clustered-Index gewinnt um etwa 8 %, da für einen Heap die zweite Suche erforderlich ist.
  • DELETE Leistung:Der gruppierte Index gewinnt um etwa 18 % aufgrund der erforderlichen zweiten Suche und der zweiten erforderlichen Löschung aus dem IAM für einen Heap.
  • einzelnes SELECT Leistung:Clustered-Index gewinnt um etwa 16 % aufgrund der zweiten Suche, die für einen Heap benötigt wird.
  • Bereich SELECT Leistung:Clustered-Index gewinnt um etwa 29 % aufgrund der zufälligen Reihenfolge für einen Heap.
  • gleichzeitiges INSERT :Heap-Tabelle gewinnt unter Last um 30 % aufgrund von Seitenaufteilungen für den gruppierten Index.