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

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"

Vorherige SeiteNächste Seite

Du kannst nicht alles an einem Tag lernen. Abonniere den Newsletter via E-Mail, Twitter oder RSS um sukzessive aufzuholen. Und sieh dir auch modern-sql.com an.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

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

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„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 und DSGVO | CC-BY-NC-ND 3.0 Lizenz