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

Postgres no usa el índice en una matriz de enteros si está instalada la extensión intraray

Esto sucede si ha instalado el "intarray " extensión. Vamos a probarlo:

drop extension intarray;

explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"

La extensión "intarray" proporciona sus propios operadores para matrices enteras, como @> , mientras que el índice está diseñado para funcionar con los operadores de matriz genéricos. Esto se puede demostrar mediante el uso de operadores calificados de esquema:

create extension intarray;

explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Seq Scan on test_intarray"

explain analyze
select * from test_intarray where codes operator([email protected]>) array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"

Consulte esta discusión para obtener más detalles:El operador &&sobrecargado del módulo intraray impide el uso del índice.

Si aún desea aprovechar la extensión "intarray", puede especificar su propia clase de operador "gin__int_ops" al crear un índice (en lugar del valor predeterminado "array_ops"):

create index test_intarray_idx2 on test_intarray using GIN (codes gin__int_ops);

explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx2"