Nie ma nie ma mowy .
Indeksy wymagają IMMUTABLE
wyrażenia. Wynik wyrażenia zależy od ciągu wejściowego. Nie widzę innego sposobu niż ocena wyrażenia dla każdego wiersza, co oznacza skanowanie sekwencyjne.
Powiązana odpowiedź z większą ilością szczegółów dla IMMUTABLE
kąt:
Tylko, że nie ma obejścia tego problemu, co jest niemożliwe Indeksować. Indeks musi przechowywać stałe wartości w swoich krotkach, które są po prostu niedostępne, ponieważ wynikowa wartość dla każdego wiersza jest obliczana na podstawie danych wejściowych. I nie możesz przekształcić danych wejściowych bez patrzenia na wartość kolumny.
Użycie indeksu Postgres jest powiązane z operatorami i indeksuje tylko wyrażenia w lewo operatora (ze względu na te same ograniczenia logiczne). Więcej:
Wielu operatorów definiuje COMMUTATOR
co umożliwia planerowi/optymalizatorowi zapytań odwrócenie indeksowanych wyrażeń w lewo. Prosty przykład:komutator =
to =
. komutator >
to <
i wzajemnie. Dokumentacja:
Operator dopasowania wyrażenia regularnego ~
nie ma komutatora, bo to nie jest możliwe. Przekonaj się sam:
SELECT oprname, oprright::regtype, oprleft::regtype, oprcom
FROM pg_operator
WHERE oprname = '~'
AND 'text'::regtype IN (oprright, oprleft);
oprname | oprright | oprleft | oprcom
---------+----------+-----------+------------
~ | text | name | 0
~ | text | text | 0
~ | text | character | 0
~ | text | citext | 0
I zapoznaj się z instrukcją tutaj:
Próbowałem już wcześniej i musiałem zaakceptować, że jest to niemożliwe z zasady .