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 Col1
haben wir auch den folgenden Index:
create nonclustered index [iTable-Col1] ON [dbo].[Table1]
(
Col1
)
include ( ColN )
Wir suchen regelmäßig nach Col1
und 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.
Antworten:
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 .quelle
Lassen Sie SQL Server Ihre Frage beantworten. Wenn der Index nützlich ist, wird er vom Abfrageoptimierer verwendet, andernfalls nicht.
quelle