Es gibt keine Möglichkeit .
Indizes erfordern IMMUTABLE
Ausdrücke. Das Ergebnis Ihres Ausdrucks hängt von der Eingabezeichenfolge ab. Ich sehe keinen anderen Weg, als den Ausdruck für jede Zeile auszuwerten, also einen sequentiellen Scan.
Zugehörige Antwort mit weiteren Details für IMMUTABLE
Winkel:
Nur, dass es für Ihren Fall keine Problemumgehung gibt, was unmöglich ist indexieren. Der Index muss konstante Werte in seinen Tupeln speichern, was einfach nicht verfügbar ist, da der resultierende Wert für jede Zeile basierend auf der Eingabe berechnet wird. Und Sie können die Eingabe nicht umwandeln, ohne sich den Spaltenwert anzusehen.
Die Verwendung von Postgres-Indizes ist an Operatoren gebunden und indiziert nur Ausdrücke links des Operators verwendet werden (aufgrund der gleichen logischen Beschränkungen). Mehr:
Viele Operatoren definieren einen COMMUTATOR
Dadurch kann der Abfrageplaner / Optimierer die indizierten Ausdrücke nach links spiegeln. Einfaches Beispiel:Der Kommutator von =
ist =
. der Kommutator von >
ist <
und umgekehrt. Die Dokumentation:
Der Übereinstimmungsoperator für reguläre Ausdrücke ~
hat wieder keinen Kommutator, weil das nicht möglich ist. Überzeugen Sie sich selbst:
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
Und konsultieren Sie das Handbuch hier:
Ich habe es schon einmal versucht und musste akzeptieren, dass es grundsätzlich unmöglich ist .