Die selektivste Spalte zuerst in den Index


Wenn man einen zusammengesetzten Index anlegt, muss man die Spaltenreihenfolge sehr sorgfältig wählen. Abschnitt 1.2 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 Abschnitt 4.3.

Bei unseren Schlulungs-, Tuning-, und
Literaturangeboten ist für jeden was dabei

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"

Über den Autor

Photo of Markus Winand
Markus Winand stimmt Entwickler auf SQL-Performance ein. Er hat das Buch SQL Performance Explained veröffentlicht und bietet inhouse Schulungen sowie Tuning-Leistungen auf http://winand.at/ an.