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"