PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

C'è un modo per indicizzare utilmente una colonna di testo contenente modelli regex?

Non c'è nessun modo .

Gli indici richiedono IMMUTABLE espressioni. Il risultato della tua espressione dipende dalla stringa di input. Non vedo altro modo se non quello di valutare l'espressione per ogni riga, ovvero una scansione sequenziale.

Risposta correlata con maggiori dettagli per IMMUTABLE angolo:

Solo che non esiste una soluzione alternativa per il tuo caso, il che è impossibile indicizzare. L'indice deve memorizzare valori costanti nelle sue tuple, che semplicemente non sono disponibili perché il valore risultante per ogni riga viene calcolato in base all'input. E non puoi trasformare l'input senza guardare il valore della colonna.

L'utilizzo dell'indice Postgres è vincolato agli operatori e solo agli indici sulle espressioni sinistra dell'operatore (a causa degli stessi vincoli logici). Altro:

Molti operatori definiscono un COMMUTATOR che consente al pianificatore/ottimizzatore di query di capovolgere le espressioni indicizzate a sinistra. Esempio semplice:il commutatore di = è = . il commutatore di > è < e viceversa. La documentazione:

L'operatore di corrispondenza dell'espressione regolare ~ non ha commutatore, di nuovo, perché non è possibile. Guarda tu stesso:

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

E consulta il manuale qui:

Ci ho già provato e ho dovuto accettare che è impossibile sul principale .