Gibt es einen Vorteil eines zweiten Index mit eingeschlossenen Spalten auf einem Primärschlüssel?


7

Ich überprüfe unsere Datenbank und habe festgestellt, dass wir für eine bestimmte Tabelle die folgenden Indizes haben:

Tabelle :

Col1    INT IDENTITY(1,1) Primary Key
Col2    INT
...
about 15 more columns
....
ColN   VARCHAR(50)
....
another 10 more columns

Zusätzlich zum Standard-Primärschlüssel-Clustered-Index Col1haben wir auch den folgenden Index:

create nonclustered index [iTable-Col1] ON [dbo].[Table1]
(
    Col1
)
include ( ColN )

Wir suchen regelmäßig nach Col1und möchten nur abrufen ColN. Dieser Index wird verwendet, da er der kleinste Index ist, der alle Daten enthält, die zur Erfüllung der Abfrage erforderlich sind.

Meine Frage ist, fügt dieser Index SQL Server einen Nutzen hinzu? Wären wir besser dran, es zu löschen und nur den Clustered-Index zu durchsuchen?

Mein einziger Gedanke ist, dass dieser Index viel kleiner ist als der Clustered-Index (25 MB gegenüber 300 MB), was das Suchen und / oder Zwischenspeichern beschleunigen kann.

Server ist SQL Server 2012, wenn dies einen Unterschied macht.


1
Ihre Frage enthält die Antwort: ( "Mein einziger Gedanke ist, dass dieser Index viel kleiner ist als der Clustered-Index (25 MB gegenüber 300 MB), was das Suchen und / oder Zwischenspeichern beschleunigen kann." )
ypercubeᵀᴹ

@ JonSeigel kannst du das weiter erklären? Warum ist es nützlich für Scans, aber nicht für Suchvorgänge?
Greg

Antworten:


8

In den meisten Fällen ist dieser Indextyp nur für Index- Scans für diese Spalten nützlich .

Die Indexbaumstruktur über der Blattebene ist in Bezug auf die Baumebenen normalerweise sehr ähnlich. Wenn dies der Fall ist, gibt es kaum oder keinen Leistungsunterschied beim Navigieren im Baum nach Suchvorgängen (die nicht auch scannen). Wenn Sie die Grundlagen von Index-Interna erlernen möchten, habe ich hier ein Video , das Ihnen helfen wird.

Wie auch immer, zurück zu den Scans. Die Gründe, warum dieser Index nützlich wäre, sind weniger der Index selbst als vielmehr der Grund, warum der Clustered-Index nicht gescannt werden sollte (oder diese Datenseiten im Speicher bleiben sollten). Wenn die anderen Spalten der Tabelle relativ breit machen (auf der Basis der Größen gab dir, würde ich sagen , dass sie tun, obwohl es unklar ist , wie groß diese Tabelle im Zusammenhang mit der gesamten Datenbank ist), der schmale Index kann in manchen Fällen von Vorteil sein , . Häufige Scans (oder Suchen nach vielen verschiedenen Schlüsselwerten) führen dazu, dass der gesamte Index im Speicher bleibt. Je größer der Index, desto weniger Speicherplatz steht für andere Objekte zur Verfügung, und dies führt natürlich zu mehr E / A, wenn der Pufferpool ist kalt.

Obwohl dies ein seltener Anwendungsfall ist (ich habe es ein- oder zweimal gemacht, an den ich mich erinnern kann), besteht der größte Vorteil dieser Art von Index darin, dass Abfragen, die einen Zusammenführungs-Join zum Verbinden dieser Tabelle verwenden möchten, erheblich unterstützt werden. (Hinweis: Optimieren Sie die Abfrage zuerst, wenn ein Index-Scan nicht geeignet ist!) Im Abfrageplan kann ein Scan des Clustered-Index oder ein Scan und eine Art nicht gruppierter Index vor einem Zusammenführungs-Join einen Hinweis darauf geben, wann dies möglich ist sei eine gute Idee. Aber auch dies ist selten. Die Abfrage sollte häufig genug ausgeführt werden oder die Basistabelle sollte teuer genug sein, um im Speicher zu bleiben (dh Sie benötigen sie dort nicht immer), um den zusätzlichen Speicher und die zusätzliche Wartung für den Index zu rechtfertigen.

Wenn Sie sich nicht sicher sind, wie dieser Index gerade verwendet wird, überprüfen Sie die DMV sys.dm_db_index_usage_stats. Beachten Sie, dass die Anzahl beim Neustart des Servers zurückgesetzt wird. Wenn Sie also den Index löschen möchten, stellen Sie sicher, dass er während des gesamten Geschäftszyklus nicht nützlich ist .


0

Lassen Sie SQL Server Ihre Frage beantworten. Wenn der Index nützlich ist, wird er vom Abfrageoptimierer verwendet, andernfalls nicht.


1
SQL verwendet immer den kleinsten Index, der eine Abfrage erfüllt. Wenn Index 1 und Index 2 beide die Abfrage erfüllen, Index 1 jedoch kleiner ist, wird dies verwendet. Das heißt nicht unbedingt, dass wir beide haben sollten?
Greg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.