Dzieje się tak, jeśli zainstalowałeś „intarray ". Przetestujmy to:
drop extension intarray;
explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"
Rozszerzenie „intarray” udostępnia własne operatory dla tablic liczb całkowitych, takie jak @>
, podczas gdy indeks jest zaprojektowany do pracy z ogólnymi operatorami tablicowymi. Można to zademonstrować za pomocą operatorów kwalifikowanych według schematu:
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"
Zobacz tę dyskusję, aby uzyskać więcej informacji:Przeciążony operator &&z modułu intarray uniemożliwia użycie indeksu.
Jeśli nadal chcesz skorzystać z rozszerzenia "intarray", możesz określić jego własną klasę operatora "gin__int_ops" podczas tworzenia indeksu (zamiast domyślnego "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"