Wenn man einen zusammengesetzten Index anlegt, muss man die Spaltenreihenfolge sehr sorgfältig wählen. „Zusammengesetzte Schlüssel“ beschäftigt sich eingehend mit diesem Thema.
Es gibt aber auch den Mythos, dass man die selektivste Spalte immer an die erste Position im Index stellen soll. Das ist ganz schlicht und einfach falsch.
Wichtig
Die wichtigste Überlegung beim Erstellen eines zusammengesetzten Indexes ist, wie man die Spaltenreihenfolge wählt, damit er möglichst oft benutzt werden kann.
Manchmal gibt es sogar Gründe, die am wenigsten selektive Spalte
zuerst in den Index zu nehmen. Die Oracle Datenbank kann solche Indizes
mit einem INDEX SKIP SCAN
auch verwenden, wenn die erste
Spalte nicht in der where
-Klausel
vorkommt. Aber das ist ein Spezialfall. Das wichtigste Kriterium beim
Erstellen eines – sagte ich das schon?
Der wahre Kern des Mythos kommt beim Indizieren unabhängiger Bereichsbedingungen zum Vorschein. Das ist nämlich der einzige Fall, bei dem die Selektivität die Spaltenreihenfolge im Index beeinflussen sollte. Siehe auch „Indizes kombinieren“.
Hinweis in eigener Sache
Ich biete SQL Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.
Im SQL Server Umfeld ist der Mythos besonders hartnäckig. Er kommt sogar in der offiziellen Dokumentation vor. Der wahre Kern ist, dass SQL Server nur für eine Spalte im Index ein Histogramm erstellt ‒ nämlich für die erste Spalte. Demnach müsste es eigentlich „ungleich verteilte Spalten zuerst“ heißen, denn Historgramme sind für gleichmäßig verteilte Spalten ohnehin nutzlos.
Ich bin nicht der Erste, der gegen diesen Mythos kämpft. Hier noch ein paar Zitate, die ebenfalls versuchen, den Mythos zu widerlegen:
Don’t automatically put the most selective term first in a concatenated index.
— Guy Harrison in "Oracle Performance Survival Guide"
One of the often-quoted fairy-tales about indexes was the directive to “put the most selective column first”. It was never a sensible rule of thumb (except, possibly, prior to version 6.0).
— Jonathan Lewis in "Oracle Scratchpad"
It’s useless to have the most selective column of the index on the left if very few queries filter on it. Queries that don’t filter on it, but do filter on the other columns of the index will have to scan, and scans are expensive.
— Gail Shaw in "SQL (Server) in the Wild"