Indeks wyrażeniowy
Indeks zakładany na wyniku wyrażenia lub funkcji, a nie bezpośrednio na kolumnie. CREATE INDEX ON users (lower(email)) przyspiesza WHERE lower(email) = .... Nazywany też indeksem funkcyjnym.
Zastosowania: wyszukiwanie bez rozróżniania wielkości liter (lower()), indeksowanie pola JSONB ((data->>'country')), klucze obliczane (date_trunc('day', created_at)). Wymaganie: wyrażenie musi być IMMUTABLE (deterministyczne — now() nie zadziała). Zapytanie musi używać dokładnie tego samego wyrażenia co indeks, aby planista go wykorzystał. Koszt: indeks jest przeliczany przy każdym zapisie. Różni się od kolumny generowanej (która materializuje wartość w prawdziwej kolumnie) — indeks wyrażeniowy przechowuje tylko zindeksowany wynik. Pozwala uniknąć zbędnych kolumn.