PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O Postgres não usa o índice no array inteiro se a extensão intarray estiver instalada


Isso acontece se você instalou o "intarray " extensão. Vamos testá-la:
drop extension intarray;

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

A extensão "intarray" fornece seus próprios operadores para arrays inteiros, como @> , enquanto o índice é projetado para funcionar com os operadores genéricos de matriz. Isso pode ser demonstrado usando operadores qualificados pelo 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"

Veja esta discussão para mais detalhes:O operador &&sobrecarregado do módulo intarray impede o uso do índice.

Se você ainda deseja aproveitar a extensão "intarray", pode especificar sua própria classe de operador "gin__int_ops" ao criar um índice (em vez do padrão "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"