von Markus Winand.

Die selektivste Spalte zuerst in den Index


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

Wenn Dir dieser Artikel gefällt, könnte mein Buch SQL Performance Explained oder mein Training auch etwas für Dich sein.

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

Foto von Markus Winand

Markus Winand lehrt effizientes SQL – inhouse und online. Er minimiert die Entwicklungszeit durch modernes SQL und optimiert die Laufzeit durch schlaue Indizierung – dazu hat er auch das Buch SQL Performance Explained veröffentlicht.

Sein Buch bei Amazon kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Bei Amazon kaufen
(Taschenbuch)

Taschenbuch und PDF auch auf Markus' Webseite erhältlich.

Sein Training

Sein beliebtes Training stimmt Entwickler auf SQL Performance ein.

Erfahren Sie mehr»

„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz | CC-BY-NC-ND 3.0 Lizenz