PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy istnieje sposób na przydatne indeksowanie kolumny tekstowej zawierającej wzorce wyrażeń regularnych?

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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wycofaj transakcję w przypadku błędu wyzwalacza

  2. PostgreSQL 9.1 używający sortowania w wybranych instrukcjach

  3. Jak zadeklarować tablicę typu rowtype w funkcji PostgreSQL?

  4. dplyr left_join przez mniej niż, więcej niż warunek

  5. Uzyskaj dostęp do PostgreSQL przez interfejs C++ (błąd konsolidatora)