Skip to content

Bedingte Indizes

Bis jetzt haben wir nur einen Index für eine oder mehrere Zeilen hinzugefügt. Das ist natürlich praktisch, wenn wir nach einzelnen Einträgen suchen oder unsere Tabelle sortieren wollen. Aber es gibt auch andere Fälle. Wir wollen zum Beispiel alle ungeraden Einträge in der money Tabelle finden. Dieses Beispiel könnte der Einfachheit halber etwas konstruierter sein, aber es ist ein gutes Beispiel, um dir zu zeigen, wie bedingte Indizes funktionieren.

Werfen wir zunächst einen Blick auf unsere ursprüngliche Abfrage, die wir ausführen wollen:

SELECT player_id, money
FROM money
WHERE money % 2 != 0;

Wenn du dir den Queryplan ansiehst, wirst du feststellen, dass wir hier keinen Index verwenden, obwohl wir einen Index für die Spalte money haben.

Lass uns einen Index für unsere Berechnung hinzufügen! Anstatt nur einen Spaltenwert zu unserem Index hinzuzufügen, fügen wir nun den umgewandelten Spaltenwert zu unserem Index hinzu, der im Grunde unsere zuvor durchgeführte Prüfung darstellt.

CREATE INDEX money_is_odd 
    ON money((money % 2 != 0))

Beachte, dass wir den Ausdruck in einen weiteren Satz Klammern schreiben. Dies ist notwendig, weil unsere Datenbank dort einen Wert und keinen Ausdruck erwartet.

SELECT player_id, money
FROM money
WHERE money % 2 != 0;

Wenn wir uns unseren Queryplan jetzt noch einmal ansehen, werden wir feststellen, dass wir tatsächlich einen Index für unsere Prüfung verwenden!

Versuchen wir das Gleiche mit einer geraden Prüfung zu tun:

SELECT player_id, money
FROM money
WHERE money % 2 = 0;

Wenn wir uns den Abfrageplan hier ansehen, sehen wir leider, dass unsere Datenbank nicht weiß, dass die Lösung einfach ein invertierter Index wäre, aber das ist eigentlich in Ordnung. Wir haben jetzt zwei Möglichkeiten:

  1. Wir fügen einen zweiten Index für gerade Zahlen hinzu

CREATE INDEX money_is_even
    ON money ((money % 2 = 0));

SELECT player_id, money
FROM money
WHERE money % 2 = 0;
2. Invertiere einfach das Ergebnis unserer Bedingung!

SELECT player_id, money
FROM money
WHERE NOT money % 2 != 0;

Die Wahl ist vielleicht schon ziemlich klar. Indizes brauchen Platz, deshalb lohnt es sich, etwas länger zu überlegen, ob du einen bestehenden Index wiederverwenden kannst, anstatt einen neuen zu erstellen. Im Allgemeinen werden Indizes nur dann verwendet, wenn der Ausdruck in der Abfrage auch im Index selbst enthalten ist. Mehr dazu im nächsten Kapitel!