PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres non utilizza l'indice sull'array intero se è installata l'estensione intarray

Ciò accade se hai installato "intarray " estensione. Proviamolo:

drop extension intarray;

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

L'estensione "intarray" fornisce i propri operatori per array di interi, come @> , mentre l'indice è progettato per funzionare con gli operatori di array generici. Questo può essere dimostrato utilizzando gli operatori qualificati per lo schema:

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"

Vedi questa discussione per maggiori dettagli:L'operatore &&sovraccaricato dal modulo intraray impedisce l'utilizzo dell'indice.

Se desideri comunque sfruttare l'estensione "intarray", puoi specificare la propria classe di operatori "gin__int_ops" durante la creazione di un indice (invece del predefinito "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"