2009-03-04 5 views

Antwort

35

Ein überdeckender Index ist einer, der alle angeforderten Spalten in einer Abfrage erfüllen kann, ohne dass eine weitere Suche im gruppierten Index durchgeführt wird.

Eine abdeckende Abfrage gibt es nicht.

Werfen Sie einen Blick auf diesen Simple-Talk-Artikel: Using Covering Indexes to Improve Query Performance.

+9

Es ist erwähnenswert, dass der Artikel, den Sie auf eine Bedachung Abfrage verknüpft bezieht. Sie scheinen es als eine Abfrage zu definieren, die Spalten auswählt, die in einen Covering-Index INCLUDEd sind - das heißt, ein Index, der nicht der Clustering-Index ist, bei dem die Spaltenwerte in seinem Blattknoten wiederholt werden. Auch ein Covering Index hat eine offensichtliche Leistungseinbuße für INSERT/UPDATE. –

+0

@ChrisMoschini, Was ist dann eine [abgedeckte Abfrage] (http://sqlmag.com/database-performance-tuning/covered-query-vs-covering-index)? Entspricht der Suchanfrage? – Pacerier

+1

@Pacerier Ja, sie sind gleich. –

2

Eine abdeckende Abfrage ist aktiviert, in der alle Vergleichselemente mithilfe der Indizes für die zugrunde liegenden Tabellen abgeglichen werden können.

Dies ist der erste Schritt zur Verbesserung der Leistung des betrachteten Sql.

8

Eine abgedeckte Abfrage ist eine Abfrage, bei der alle Spalten in der Ergebnismenge der Abfrage aus nicht gruppierten Indizes abgerufen werden.

Durch die sinnvolle Anordnung der Indizes wird eine Abfrage in eine abgedeckte Abfrage durchgeführt. Eine abgedeckte Abfrage ist oft leistungsfähiger als eine nicht abgedeckte Abfrage, weil nicht gruppierte Indizes mehr Zeilen pro Seite aufweisen als gruppierte Indizes oder Heap-Indizes. Daher müssen weniger Seiten in den Speicher geladen werden, um die Anforderungen zu erfüllen Abfrage. Sie haben mehr Zeilen pro Seite, da nur ein Teil der Tabellenzeile Teil der Indexzeile ist.

Ein Index ist ein Index, der in einer abgedeckten Abfrage verwendet wird. Es gibt keinen Index, der an und für sich ein Deckungsindex ist. Ein Index ein abdeckenden Index bezüglich sein kann A abzufragen, während zur gleichen Zeit kein abdeckenden Index bezüglich sein B. zur Abfrage

+0

Da ein wesentlicher Aspekt der Performance ist, "wie viele Seiten muss ich in den Speicher bringen, um die volle Ergebnismenge zurückzugeben", bedeutet das, dass ** eine 'LIMIT 1'-Abfrage nicht von der Deckungsoptimierung profitiert? ** In den meisten Fällen erfordert das Aufnehmen eines einzelnen Datensatzes nur einen einzelnen Seitenlesevorgang (Randfälle wie Off-Page-Speicher oder wirklich große Tabellen werden ignoriert). Auch bei einer nicht abgedeckten Abfrage. – Birchlabs

5

Hier an article in devx.com, der sagt:

einen nicht gruppierten Index erstellen dass über alle Spalten in einer SQL-Abfrage verwendet, eine so genannte Technik Index abdeckt

ich kann nur annehmen, dass eine abgedeckt Abfrage ist eine Abfrage, die einen Index, der die Spalten alle bedeckt in sein zurückgegebenes Re-Cord-Set. Ein Vorbehalt - der Index und die Abfrage müssten erstellt werden, damit der SQL-Server tatsächlich aus der Abfrage ableiten kann, dass der Index nützlich ist.

Zum Beispiel kommen ein von einem Tisch auf sich vielleicht nicht von solchen Index profitieren (abhängig von der Intelligenz des Abfrageausführungsplaner SQL):

PersonID ParentID Name 
1  NULL  Abe 
2  NULL  Bob 
3  1  Carl 
4  2  Dave 

Nehmen wir an, es gibt einen Index auf PersonID,ParentID,Name - das

SELECT PersonID, ParentID, Name FROM MyTable 

Aber eine Abfrage wie folgt:

SELECT PersonID, Name FROM MyTable LEFT JOIN MyTable T ON T.PersonID=MyTable.ParentID 
ein abdeckenden Index für eine Abfrage wie wäre

Wahrscheinlich würde es nicht so viel nutzen, obwohl alle Spalten im Index stehen. Warum?Weil Sie nicht wirklich sagen, dass Sie den Triple-Index PersonID,ParentID,Name verwenden möchten.

Stattdessen Sie bauen eine Bedingung basiert auf zwei Säulen - PersonID und ParentID (die auslässt Name) und dann sind Sie für alle Datensätze bitten, mit den Säulen PersonID, Name. Tatsächlich könnte der Index je nach Implementierung dem letzteren Teil helfen. Aber für den ersten Teil ist es besser, andere Indizes zu haben.

19

Wenn alle Spalten in der select Liste der Abfrage angefordert, sind verfügbar im Index, dann die Abfrage-Engine haben, um die Tabelle nicht wieder nachzuschlagen, welche erheblich die Leistung der Abfrage erhöhen. Da alle angeforderten Spalten im Index verfügbar sind, deckt der Index die Abfrage ab. Daher wird die Abfrage als eine abdeckende Abfrage bezeichnet, und der Index ist ein abdeckender Index.

Ein gruppierter Index kann immer eine Abfrage abdecken, wenn die Spalten in der Auswahlliste aus derselben Tabelle stammen.

die folgenden Links können hilfreich sein, wenn Sie indizieren Konzepte neu sind:

2

ein abdeckenden Index diejenige ist, die jede gewünschte Spalte und in denen gibt SQL Server muss nicht zurück zum Clustered-Index springen, um eine Spalte zu finden. Dies wird erreicht, indem ein nicht gruppierter Index verwendet wird und die Option INCLUDE zum Verdecken von Spalten verwendet wird. Nicht-Schlüsselspalten können nur in nicht gruppierten Indizes enthalten sein. Spalten können nicht in der Schlüsselspalte und der INCLUDE-Liste definiert werden. Spaltennamen können nicht in der INCLUDE-Liste wiederholt werden. Nicht-Schlüsselspalten können nur dann aus einer Tabelle gelöscht werden, nachdem der Nichtschlüsselindex zuerst fallengelassen wurde. Please see details here

1

Als ich mich einfach daran erinnerte, dass ein Clustered Index aus einer Schlüsselsortierten Nicht-Heap-Liste ALLER Spalten in der definierten Tabelle besteht, gingen die Lichter für mich an. Das Wort "Cluster" bezieht sich dann auf die Tatsache, dass es einen "Cluster" von allen Spalten gibt, wie eine Gruppe von Fischen in diesem "Hot Spot". Wenn es keinen Index gibt, der die Spalte mit dem gesuchten Wert (die rechte Seite der Gleichung) abdeckt, verwendet der Ausführungsplan einen Clustered-Index-Seek in die Darstellung der angeforderten Spalte im Clustered-Index, da er die angeforderte Spalte in keiner anderen Spalte findet "Deckung" Index. Das Fehlen wird einen Clustered Index Seek Operator im vorgeschlagenen Ausführungsplan verursachen, wobei der gesuchte Wert innerhalb einer Spalte innerhalb der geordneten Liste liegt, die durch den Clustered Index repräsentiert wird.

Eine Lösung besteht also darin, einen nicht gruppierten Index zu erstellen, der die Spalte enthält, die den angeforderten Wert im Index enthält. Auf diese Weise muss nicht auf den gruppierten Index verwiesen werden, und der Optimierer sollte in der Lage sein, diesen Index im Ausführungsplan ohne Hinweis anzuhängen. Wenn es jedoch ein Prädikat gibt, das den Clusterschlüssel für einzelne Spalten und ein Argument für einen Skalarwert im Clusterschlüssel angibt, wird der Clustered Index Seek Operator weiterhin verwendet, auch wenn bereits ein Deckungsindex für eine zweite Spalte in der Tabelle ohne Index.

6

Ein Covering Index ist ein Non-Clustered Index. Sowohl Clustered- als auch Non-Clustered-Indizes verwenden B-Trees, um die Suche nach Daten zu verbessern. Der Unterschied besteht darin, dass in den Blättern eines Clustered Index ein ganzer Datensatz (dh Zeile) physisch gespeichert wird! Dies ist jedoch nicht der Fall Non-Clustered-Indizes.

Beispiel: Ich habe eine Tabelle mit drei Spalten: ID, Fname und Lname.

enter image description here

jedoch für einen nicht gruppierten Index, gibt es zwei Möglichkeiten: entweder die Tabelle hat bereits einen Clustered-Index oder es funktioniert nicht:

enter image description here

Da die beiden Diagramme Zeigen Sie, dass solche Non-Clustered-Indizes keine gute Leistung bieten, da sie den bevorzugten Wert (dh Lname) nicht ausschließlich aus dem B-Tree finden können. Stattdessen müssen sie einen zusätzlichen Nachschlage-Schritt (Schlüssel oder RID-Suche) durchführen, um den Wert von Lname zu finden. Und, Dies ist, wo Covered Index auf den Bildschirm kommt. Hier deckt der Non-Clustered-Index für ID den Wert von Lname direkt daneben in den Blättern des B-Baums ab, und es besteht keine Notwendigkeit für irgendeine Art von Nachschlagen mehr.

enter image description here

Verwandte Themen