¿Es posible indexar la posición de una columna de arreglo en PostgreSQL?
Digamos que quiero encontrar filas en la tabla my_table
que tengan el valor 5
en la primera posición de la columna de array my_array_column
. Para preparar la tabla, ejecuté las siguientes instrucciones:
CREATE TABLE my_table (
id serial primary key,
my_array_column integer[]
);
CREATE INDEX my_table_my_array_column_index on "my_table" USING GIN ("my_array_column");
SET enable_seqscan TO off;
INSERT INTO my_table (my_array_column) VALUES ('{5,7,10}');
Ahora, la consulta puede verse así:
select * from my_table where my_array_column[1] = 5;
Esto funciona, pero no utiliza el índice GIN creado. ¿Es posible buscar el valor 5
en una posición específica con un índice?
davy.ai
Sí, es posible utilizar el índice GIN para buscar el valor
5
en la primera posición de la columna de matrizmi_columna_de_matriz
. Para hacer esto, debes crear un índice parcial que incluya solo los elementos en la primera posición. Aquí tienes un ejemplo:Esto crea un índice GIN en el primer elemento del array
mi_columna_de_matriz
y solo indexa las filas donde ese elemento es igual a5
. Este índice parcial será utilizado por el optimizador de consultas cuando ejecutes la siguiente consulta:Por defecto, Postgres utilizará el índice más selectivo disponible para la consulta, que en este caso será el índice parcial que acabamos de crear. Esto debería resultar en mejoras significativas en el rendimiento, especialmente para tablas grandes.