Ich kenne die Antwort auf diese Frage schon ein wenig, aber ich habe immer das Gefühl, dass ich mehr zu diesem Thema tun muss.
Mein grundlegendes Verständnis ist, dass im Allgemeinen ein einziger Index, der nur alle Felder enthält, nach denen Sie möglicherweise zu einem bestimmten Zeitpunkt fragen / sortieren, wahrscheinlich nicht nützlich ist, aber ich habe diese Art von Dingen gesehen. Wie in, dachte jemand, "Nun, wenn wir all diese Dinge einfach in einen Index stellen, kann die Datenbank damit herausfinden, was sie benötigt", ohne jemals einen Ausführungsplan für einige der tatsächlich ausgeführten Abfragen gesehen zu haben.
Stellen Sie sich einen Tisch so vor:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Ich könnte einen einzigen Index einschließlich der sehen name
, customerId
und dateCreated
Felder.
Ich verstehe jedoch, dass ein solcher Index nicht in einer Abfrage verwendet wird, wie zum Beispiel:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Für eine solche Abfrage scheint mir eine bessere Idee ein Index zu sein, der die Felder customerId
und enthält dateCreated
, wobei das customerId
Feld 'first' ist. Auf diese Weise wird ein Index erstellt, in dem die Daten so organisiert sind, dass diese Abfrage schnell das findet, was sie benötigt - in der Reihenfolge, in der sie benötigt.
Eine andere Sache, die ich vielleicht so häufig wie die erste sehe, sind einzelne Indizes für jedes Feld; so, je eine auf name
, customerId
und dateCreated
Felder.
Im Gegensatz zum ersten Beispiel scheint mir diese Art der Anordnung manchmal zumindest teilweise nützlich zu sein; Der Ausführungsplan der Abfrage zeigt möglicherweise, dass zumindest der Index für die customerId
Auswahl der Datensätze verwendet wird, nicht jedoch der Index für das dateCreated
Feld, um sie zu sortieren.
Ich weiß, dass dies eine weit gefasste Frage ist, da die spezifische Antwort auf eine bestimmte Abfrage in einer bestimmten Menge von Tabellen normalerweise darin besteht, zu sehen, was der Ausführungsplan vorschreibt, und ansonsten die Besonderheiten der Tabelle (n) und Abfragen zu berücksichtigen Konto. Ich weiß auch, dass dies davon abhängt, wie oft eine Abfrage ausgeführt wird, und nicht davon, ob ein bestimmter Index dafür verwaltet wird.
Aber ich nehme an, was ich frage, ist ein allgemeiner "Ausgangspunkt" für Indizes. Ist die Idee, bestimmte Indizes für bestimmte, häufig abgerufene Abfragen und die Felder in den WHERE- oder ORDER BY-Klauseln zu haben, sinnvoll?
quelle
Ja, um Ihre ursprüngliche Frage zu beantworten, müssen Indizes für die Abfragen erstellt werden , nicht nur für die Tabelle . Die Reihenfolge der Felder im Index ist von entscheidender Bedeutung. Es ist schwieriger, einen einzelnen Index so zu gestalten, dass er für mehrere Abfragen optimal ist, und Sie müssen Kompromisse eingehen.
In Bezug auf Ihren zweiten Punkt ist es ärgerlich, dass eine Reihe von Indizes für einzelne einzelne Felder vorhanden sind. Ich sehe es die ganze Zeit in meiner Umgebung und es ist normalerweise eine rote Fahne für mich, dass das Entwicklungsteam nicht mit einem DBA zusammengearbeitet hat, um die richtigen Indizes zu entwerfen.
Meine Strategie zum Entwerfen von Indizes besteht darin, Folgendes zu indizieren:
Also für dein Beispiel:
Ich würde wahrscheinlich einen Index für (CustomerID, dateCreated) INCLUDE (id, name) entwerfen. Dieser Deckungsindex bedeutet, dass die Abfrage niemals die ursprüngliche Tabelle erreichen muss, was die Leistung erheblich verbessert.
Dieses Beispiel ist jedoch fast zu einfach. Ein naiver Index für nur (CustomerID) würde fast genauso gut abschneiden (vorausgesetzt, jeder Kunde hat nur einen einzigen Mitarbeiter, so dass nur ein einziges Lesezeichen für die Tabelle erforderlich ist). Es kann auch nützlich sein, einen Clustered- Index für (CustomerID, ID) zu erstellen , abhängig davon, welche anderen Abfragen für die Tabelle ausgeführt werden.
quelle