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
Ci ho già provato e ho dovuto accettare che è impossibile sul principale .