@Tregoreg planteó una pregunta en el comentario a su recompensa ofrecida:
No encontré las respuestas actuales funcionando. El uso del índice GIN en una columna de tipo matriz no aumenta el rendimiento de cualquier operador (). ¿Realmente no hay solución?
La respuesta aceptada de @ Frank le dice que use operadores de matriz , que todavía es correcto para Postgres 11. El manual:
... la distribución estándar de PostgreSQL incluye una clase de operador GIN para matrices, que admite consultas indexadas utilizando estos operadores:
<@
@>
=
&&
La lista completa de clases de operador integradas para índices GIN en la distribución estándar está aquí.
En Postgres, los índices están vinculados a operadores (que se implementan para ciertos tipos), no a tipos de datos solos o funciones o cualquier otra cosa. Esa es una herencia del diseño original de Berkeley de Postgres y muy difícil de cambiar ahora. Y generalmente funciona bien. Aquí hay un hilo sobre pgsql-bugs con Tom Lane comentando sobre esto.
Algunas funciones de PostGis (como ST_DWithin()
) parecen violar este principio, pero eso no es así. Esas funciones se reescriben internamente para usar los operadores respectivos .
La expresión indexada debe estar a la izquierda del operador. Para la mayoría de los operadores ( incluido todo lo anterior ), el planificador de consultas puede lograr esto volteando los operandos si coloca la expresión indexada a la derecha, dado que a COMMUTATOR
se ha definido. La ANY
construcción se puede usar en combinación con varios operadores y no es un operador en sí mismo. Cuando se usa como constant = ANY (array_expression)
solo índices que soportan al =
operador en elementos de matriz calificarían y necesitaríamos un conmutador para = ANY()
. Los índices GIN están fuera.
Postgres actualmente no es lo suficientemente inteligente como para derivar una expresión indexable a GIN. Para empezar, noconstant = ANY (array_expression)
es completamente equivalente a array_expression @> ARRAY[constant]
. Los operadores de matriz devuelven un error si hay elementos NULL involucrados, mientras que la ANY
construcción puede tratar con NULL en cualquier lado. Y hay resultados diferentes para los desajustes de tipo de datos
Respuestas relacionadas:
Aparte
Mientras trabaja con integer
matrices ( int4
, no int2
o int8
) sin NULL
valores (como su ejemplo lo indica) considere el módulo adicional intarray
, que proporciona operadores especializados y más rápidos y soporte de índice. Ver:
En cuanto a la UNIQUE
restricción en su pregunta que no recibió respuesta: se implementa con un índice btree en todo el valor de la matriz (como sospechaba) y no ayuda en absoluto en la búsqueda de elementos . Detalles:
jsonb
y los índices? postgresql.org/docs/9.5/static/functions-json.html y postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING