Frage

Da sowohl a Table Scan und ein Clustered Index Scan Grundsätzlich werden alle Datensätze in der Tabelle gescannt. Warum ist ein Clustered-Index-Scan angeblich besser?

Als Beispiel: Was ist der Leistungsunterschied zwischen den folgenden, wenn viele Datensätze vorhanden sind?:

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp
War es hilfreich?

Lösung

In einer Tabelle ohne Clustered-Index (einer Heap-Tabelle) sind Datenseiten nicht miteinander verknüpft – das Durchlaufen von Seiten erfordert also eine Suchen Sie in der Indexzuordnungskarte nach.

Eine gruppierte Tabelle hat es jedoch Datenseiten, die in einer doppelt verknüpften Liste verknüpft sind - Sequentielle Scans etwas schneller machen.Im Gegenzug fällt Ihnen natürlich der Aufwand an, die Datenseiten in Ordnung zu halten INSERT, UPDATE, Und DELETE.Eine Heap-Tabelle erfordert jedoch einen zweiten Schreibvorgang in das IAM.

Wenn Ihre Anfrage eine hat RANGE Operator (z.B.: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100), dann wäre eine gruppierte Tabelle (in garantierter 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 die Reihenfolge verlassen kann.

Und natürlich können Sie mit einem Clustered-Index eine CLUSTERED INDEX SEEK durchführen, was für die Leistung ziemlich optimal ist ... ein Heap ohne Indizes würde immer zu einem Tabellenscan führen.

Also:

  • Bei Ihrer 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 Anfrage mit a WHERE Klausel, die vom Clustered-Index (zumindest teilweise) 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 Clustered-Index erfüllt wird, sind Sie ziemlich ausgeglichen ... auch hier besteht der einzige Unterschied in der doppelt verknüpften Liste für sequentielles Scannen.In beiden Fällen sind Sie suboptimal.

  • Für INSERT, UPDATE, Und DELETE ein Haufen kann gewinnen oder auch 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 eine weißes Papier Dadurch wird ein Clustered-Index mit einem entsprechenden Nicht-Clustered-Index auf einem Heap verglichen (nicht genau das Gleiche wie oben besprochen, aber nahe dran).Ihre Schlussfolgerung besteht im Wesentlichen darin, einen Clustered-Index für alle Tabellen zu erstellen.Ich werde mein Bestes tun, um ihre Ergebnisse zusammenzufassen (beachten Sie noch einmal, dass sie hier tatsächlich einen nicht gruppierten Index mit einem gruppierten Index vergleichen – aber ich denke, dass er relativ vergleichbar ist):

  • INSERT Leistung:Der Clustered-Index gewinnt aufgrund des zweiten Schreibvorgangs, der für einen Heap erforderlich ist, um etwa 3 %.
  • UPDATE Leistung:Der Clustered-Index gewinnt aufgrund der für einen Heap erforderlichen zweiten Suche um etwa 8 %.
  • DELETE Leistung:Der Clustered-Index gewinnt um etwa 18 %, da die zweite Suche erforderlich ist und der zweite Löschvorgang aus dem IAM für einen Heap erforderlich ist.
  • einzel SELECT Leistung:Der Clustered-Index gewinnt aufgrund der für einen Heap erforderlichen zweiten Suche um etwa 16 %.
  • Reichweite SELECT Leistung:Der Clustered-Index gewinnt aufgrund der zufälligen Reihenfolge für einen Heap um etwa 29 %.
  • gleichzeitig INSERT:Heap-Tabelle gewinnt unter Last aufgrund von Seitenaufteilungen für den Clustered-Index um 30 %.

Andere Tipps

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

Der logische und physische Operator „Clustered Index Scan“ scannt den in der Spalte „Argument“ angegebenen Clustered Index.Wenn ein optionales WHERE:()-Prädikat vorhanden ist, werden nur die Zeilen zurückgegeben, die das Prädikat erfüllen.Wenn die Argument-Spalte die ORDERED-Klausel enthält, hat der Abfrageprozessor angefordert, dass die Ausgabe der Zeilen in der Reihenfolge zurückgegeben wird, in der sie vom Clustered-Index sortiert wurden.Wenn die ORDERED-Klausel nicht vorhanden ist, scannt die Speicher-Engine den Index optimal (ohne zu garantieren, dass die Ausgabe sortiert wird).

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

Der logische und physische Operator „Table Scan“ ruft alle Zeilen aus der in der Spalte „Argument“ angegebenen Tabelle ab.Wenn ein WHERE:()-Prädikat in der Argumentspalte erscheint, werden nur die Zeilen zurückgegeben, die das Prädikat erfüllen.

Bei einem Tabellenscan muss jede einzelne Zeile der Tabelle untersucht werden.Der Clustered-Index-Scan muss nur den Index scannen.Es wird nicht jeder Datensatz in der Tabelle gescannt.Das ist eigentlich der Sinn von Indizes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top