No puedo encontrar una respuesta definitiva a esta pregunta en la documentación. Si una columna es un tipo de matriz, ¿se indexarán individualmente todos los valores ingresados?
Creé una tabla simple con una int[]
columna y le puse un índice único. Noté que no podía agregar la misma matriz de entradas, lo que me lleva a creer que el índice es una composición de los elementos de la matriz, no un índice de cada elemento.
INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');
INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');
SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");
¿El índice está ayudando a esta consulta?
arrays
postgresql
indexing
IamIC
fuente
fuente
jsonb
y los índices? postgresql.org/docs/9.5/static/functions-json.html y postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXINGRespuestas:
Sí, puede indexar una matriz, pero debe usar los operadores de matriz y el tipo de índice GIN .
Ejemplo:
Resultado:
Notaparece que en muchos casos se requiere la opción gin__int_ops
Todavía no he visto un caso en el que funcione con el operador && y @> sin las opciones gin__int_ops
fuente
gin__int_ops
se utilicen parainteger[]
columnas. Me llevó años de frustración y buscar otras soluciones hasta que descubrí esta clase operativa. Es un hacedor de milagros límite.@Tregoreg planteó una pregunta en el comentario a su recompensa ofrecida:
La respuesta aceptada de @ Frank le dice que use operadores de matriz , que todavía es correcto para Postgres 11. El manual:
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. LaANY
construcción se puede usar en combinación con varios operadores y no es un operador en sí mismo. Cuando se usa comoconstant = 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, no
constant = ANY (array_expression)
es completamente equivalente aarray_expression @> ARRAY[constant]
. Los operadores de matriz devuelven un error si hay elementos NULL involucrados, mientras que laANY
construcción puede tratar con NULL en cualquier lado. Y hay resultados diferentes para los desajustes de tipo de datosRespuestas relacionadas:
Compruebe si existe un valor en la matriz de Postgres
Índice para encontrar un elemento en una matriz JSON
SQLAlchemy: ¿cómo filtrar en los tipos de columna PgArray?
¿Puede IS DISTINCT FROM combinarse con CUALQUIERA o TODO de alguna manera?
Aparte
Mientras trabaja con
integer
matrices (int4
, noint2
oint8
) sinNULL
valores (como su ejemplo lo indica) considere el módulo adicionalintarray
, 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:fuente
gin__int_ops
se utilicen parainteger[]
columnas. Me llevó años de frustración y buscar otras soluciones hasta que descubrí esta clase operativa. Es un hacedor de milagros límite.ANY (array_expression) = constant
expresiones, ¿funcionan bien los índices GIN?Ahora es posible indexar los elementos de la matriz individual. Por ejemplo:
Esto funciona al menos en Postgres 9.2.1. Tenga en cuenta que debe crear un índice separado para cada índice de matriz, en mi ejemplo, solo indicé el primer elemento.
fuente