Expression Index
Ein Index auf dem Ergebnis eines Ausdrucks oder einer Funktion statt direkt auf einer Spalte. CREATE INDEX ON users (lower(email)) macht WHERE lower(email) = ... schnell. Auch functional index genannt.
Anwendungsfälle: case-insensitive Suche (lower()), Indizierung eines JSONB-Felds ((data->>'country')), berechnete Schlüssel (date_trunc('day', created_at)). Voraussetzung: Der Ausdruck muss IMMUTABLE sein, also deterministisch — now() funktioniert nicht. Die Abfrage muss exakt denselben Ausdruck wie der Index verwenden, damit der Planer ihn überhaupt nutzt. Der Haken: Der Index wird bei jedem Schreibvorgang neu berechnet. Unterschied zur generated column, die den Wert in einer echten Spalte materialisiert — ein Expression Index speichert nur das indizierte Ergebnis. Üblich, um redundante Spalten zu vermeiden.