sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Hay alguna manera de indexar de manera útil una columna de texto que contenga patrones de expresiones regulares?

No hay de ninguna manera .

Los índices requieren IMMUTABLE expresiones El resultado de su expresión depende de la cadena de entrada. No veo otra forma que evaluar la expresión de cada fila, lo que significa un escaneo secuencial.

Respuesta relacionada con más detalles para IMMUTABLE ángulo:

Solo que no hay una solución para su caso, lo cual es imposible al Indice. El índice necesita almacenar valores constantes en sus tuplas, lo que simplemente no está disponible porque el valor resultante para cada fila se calcula en función de la entrada. Y no puede transformar la entrada sin mirar el valor de la columna.

El uso del índice de Postgres está vinculado a los operadores y solo a los índices en las expresiones izquierda del operador se puede utilizar (debido a las mismas restricciones lógicas). Más:

Muchos operadores definen un COMMUTATOR lo que permite que el planificador/optimizador de consultas voltee las expresiones indexadas hacia la izquierda. Ejemplo simple:el conmutador de = es = . el conmutador de > es < y viceversa. La documentación:

El operador de coincidencia de expresiones regulares ~ no tiene conmutador, de nuevo, porque eso no es posible. Compruébelo usted mismo:

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

Y consulta el manual aquí:

Lo he intentado antes y tuve que aceptar que es imposible por principio .