Frage

Können Sie die Konzepte und Beziehungen zwischen erklären, Bedecken Indizes und Covered-Abfragen in Microsoft SQL Server?

War es hilfreich?

Lösung

Eine Abdeckung Index die ohne Durchführung eines weiteren Nachschlag in den gruppierten Index alle angeforderten Spalten in einer Abfrage erfüllen kann.

Es gibt nicht so etwas wie eine Abdeckung Abfrage.

Haben Sie einen Blick auf diesem Simple-Talk-Artikel: die Verwendung von Indizes Covering Abfrageleistung zu verbessern.

Andere Tipps

Wenn alle Spalten in der select Liste der Abfrage angefordert, sind verfügbar im Index , dann die Abfrage-Engine nicht die Tabelle wieder nachzuschlagen, wo signifikant die Leistung der Abfrage erhöhen. Da alle angeforderten Spalten mit im Index vorhanden sind, deckt der Index die Abfrage. So wird die Abfrage einer Abdeckung Abfrage bezeichnet und der Index ein abdeckenden Index.

Ein Clustered-Index kann immer eine Abfrage abdecken, wenn die Spalten in der Auswahlliste aus derselben Tabelle sind.

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

A Covering Index ist ein Non-Clustered Index. Beide gruppierte und nicht gruppierte Indizes B-Baum-Datenstruktur verwenden, um die Suche nach Daten zu verbessern, ist der Unterschied, dass in den Blättern eines Clustered Index eine ganze Platte (dh Reihe) physikalisch genau dort gespeichert !, aber dies ist nicht der Fall für Non-Clustered-Indizes. Die folgenden Beispiele verdeutlichen es:

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

 image description hier

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

 image description hier

Wie die beiden Abbildungen zeigen, wie Non-Clustered-Indizes bietet keine gute Leistung, weil sie nicht den Liebling Wert finden (das heißt Lname) allein aus dem B-Baum. Stattdessen haben sie einen zusätzlichen Look Up Schritt (entweder Key oder RID sehen) zu tun, um den Wert von Lname zu finden. Und ist dies, wenn überdachter Index auf den Bildschirm kommt. Hier ist der Non-Clustered-Index für ID coveres der Wert Lname direkt daneben in den Blättern des B-Baumes, und es gibt keine Notwendigkeit, für jede Art von mehr nachschlagen.

 image description hier

abgedeckt Abfrage ist eine Abfrage, in der alle Spalten in der Ergebnismenge der Abfrage von nicht gruppierte Indizes gezogen werden.

Eine Abfrage wird in eine abgedeckten Abfrage durch die umsichtige Anordnung von Indizes.

Eine überdachte Abfrage ist oft mehr performant als eine nicht abgedeckte Abfrage teilweise, weil nicht gruppierten Indizes haben mehr Zeilen pro Seite als Clustered-Indizes oder Heap-Indizes, so dass weniger Seiten in dem Speicher, um gebracht werden müssen, die Abfrage zu erfüllen . Sie haben mehr Zeilen pro Seite, weil nur ein Teil der Tabellenzeile Teil der Indexzeile ist.

A abdeckenden Index ist ein Index, der in einer überdachten Abfrage verwendet wird. Es gibt nicht so etwas wie einen Index, die an und für sich, eine Abdeckung Index ist. Ein Index kann ein abdeckenden Index in Bezug sein, einen abzufragen, während zur gleichen Zeit keinen abdeckenden Index in Bezug zu sein abzufragen B.

Hier rel="noreferrer">, der sagt:

  

einen nicht gruppierten Index erstellen, die alle Spalten in einer SQL-Abfrage verwendet wird, enthält, eine Technik namens Index abdeckt

Ich kann nur annehmen, dass ein abgedeckt Abfrage ist eine Abfrage, die einen Index, der die Spalten alle in seiner zurück-Cord abdeckt. Ein Nachteil -. Der Index und Abfrage müßte gebaut werden, wie der SQL-Server ermöglichen, tatsächlich aus der Abfrage zu schließen, dass der Index nützlich ist

Zum Beispiel einer Verknüpfung einer Tabelle auf mich selbst nicht von solchen Index profitieren könnte (abhängig von der Intelligenz des SQL-Abfrageausführungsplaners):

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 - dies ist ein abdeckenden Index für eine Abfrage würde wie:

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

würde benifit Wahrscheinlich nicht so sehr, obwohl alle Spalten im Index enthalten sind. Warum? Weil du nicht wirklich doch sagen, dass Sie die dreifache Index von PersonID,ParentID,Name verwenden.

Stattdessen sind bauen Sie eine Bedingung basiert auf zwei Säulen - PersonID und ParentID (die Name auslässt) und dann für Sie fragen alle Datensätze, mit dem Spalten PersonID, Name. Eigentlich, je nach Ausführung, kann der Index auf den letzten Teil helfen. Aber für den ersten Teil, sind Sie besser dran andere Indizes haben.

Eine Abdeckung Abfrage ist auf dem alle Prädikate können unter Verwendung der Indizes auf den zugrunde liegenden Tabellen angepasst werden.

Dies ist der erste Schritt, um die Leistung des SQL unter Berücksichtigung auf der Verbesserung.

Wenn ich daran erinnert, nur dass ein Clustered Index eines Schlüssel bestellt besteht Nicht-Heap Liste aller Spalten in der Tabelle definiert, gingen die Lichter für mich auf. Das Wort „Cluster“ bezieht sich dann auf die Tatsache, dass es eine „Cluster“ alle Spalten, wie ein Cluster von Fisch in diesen „hot spot“. Wenn es kein Index für den Spalt den gesuchten Wert (die rechte Seite der Gleichung) enthält, verwendet der Ausführungsplan ein Clustered Index des angeforderten Spalts Sucht in die Vertretung des Clustered Index, weil es nicht die gewünschte Spalte in einem anderen nicht findet "Abdeckung" index. Die fehlende verursacht eine Clustered Index-Operator in dem vorgeschlagenen Ausführungsplan suchen, wo der gesuchte Wert innerhalb einer Spalte innerhalb der geordneten Liste durch den Clustered Index vertreten ist.

So ist eine Lösung, die einen nicht gruppierten Index zu erstellen, die die Spalte enthält den gewünschten Wert innerhalb des Index hat. Auf diese Weise gibt es keine Notwendigkeit zu verweisen sollte den Clustered-Index und die Optimierung der Lage sein, ohne Hinweis darauf, dass Index im Ausführungsplan zu anschließen. Wenn jedoch ein Prädikats Benennung der einzelnen Spalte Clustering-Schlüssel und ein Argument zu einem skalaren Wert auf der Clustering-Schlüssel ist, wird der Cluster-Index Seek Operator weiterhin verwendet werden, auch wenn es bereits einen abdeckenden Index auf einer zweiten Säule in der Tabelle ohne Index.

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