Това се случва, ако сте инсталирали "intarray ". Нека го тестваме:
drop extension intarray;
explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"
Разширението "intarray" предоставя свои собствени оператори за масиви с цели числа, като @>
, докато индексът е проектиран да работи с генеричните оператори за масиви. Това може да се демонстрира чрез използване на квалифицирани от схема оператори:
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"
Вижте тази дискусия за повече подробности:Претовареният &&оператор от модула за интаррей предотвратява използването на индекс.
Ако все пак искате да се възползвате от разширението „intarray“, можете да посочите неговия собствен операторен клас „gin__int_ops“, когато създавате индекс (вместо „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"