Und so kommt die Kunst der Leistungsoptimierung und Indizierungsstrategien zum Tragen ...
Es erscheint mir logisch, die bestehende Indexdefinition so zu ändern, dass sie die vorgeschlagenen Spalten enthält
Ich werde Ihr Zitat nehmen und eine dritte Indexdefinition schreiben:
create index [idx_index3]
on [table1] (col1, col2, col3)
include (col4, col5, col6....);
Dies sollte die CREATE INDEX
Aussage sein, die Ihrer zitierten Aussage entspricht.
Das mag eine umsichtige Lösung sein, aber es kommt darauf an . Hier sind einige Beispiele, wenn ich sage, dass es darauf ankommt.
Wenn Sie eine gemeinsame Arbeitslast haben, die hauptsächlich aus Abfragen wie diesen besteht:
select col1, col2, col3
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Dann wäre Ihr idx_index1
Index solide. Perfekt schmal, ist es ein Index, der diese Abfrage ohne fremde Daten erfüllt (ohne Berücksichtigung der Clustered-Index-Definition, wenn überhaupt).
Wenn Sie jedoch eine Arbeitslast haben, die hauptsächlich aus folgenden Abfragen besteht:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2;
Dann idx_index2
wäre es klug, da es sich um einen so genannten Deckungsindex handelt , der die Notwendigkeit einer Schlüsselsuche zurück zum Clustered-Index (oder einer RID-Suche zurück zum Heap) verhindert. Diese nicht gruppierte Indexdefinition würde ausschließlich alle Daten umfassen, die für die Abfrage erforderlich sind.
Mit Ihrer Empfehlung eignet es sich gut für eine Abfrage wie die folgende:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Ihre idx_index3
Empfehlung wäre ein Deckungsindex, der die Suchkriterien für die obige Abfrage erfüllt.
Der Punkt, auf den ich zu kommen versuche, ist eine isolierte Frage wie diese, die wir nicht definitiv beantworten können. Es hängt alles von der allgemeinen und häufigen Arbeitsbelastung ab. Natürlich können Sie immer alle drei dieser Indizes definieren, um jeden Beispielabfragetyp zu behandeln, aber dann wird die Wartung in Frage gestellt, die erforderlich ist, um diese Indizes auf dem neuesten Stand zu halten (denken Sie an INSERTs, UPDATEs, DELETEs). Das ist der Overhead von Indizes.
Sie müssen die Arbeitsbelastung analysieren und bewerten und bestimmen, wo die Vorteile am besten sind. Wenn die erste Beispielabfrage bei weitem die häufigste ist, die Dutzende Male pro Sekunde ausgeführt wird, und es eine sehr seltene Abfrage wie die dritte Beispielabfrage gibt, ist es nicht sinnvoll, die Seiten auf Blattebene des Index mit dem aufzublähen INCLUDE
Nichtschlüsselspalten. Es hängt alles von Ihrer Arbeitsbelastung ab.
Wenn Sie umsichtige Indizierungsstrategien verstehen und Ihre gemeinsame Arbeitsbelastung verstehen, können Sie durch Anwenden beider Strategien den besten Weg finden.