PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es eine Möglichkeit, eine Textspalte mit Regex-Mustern sinnvoll zu indizieren?

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 .