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?