Dies passiert, wenn Sie das "intarray installiert haben " Erweiterung. Lass es uns testen:
drop extension intarray;
explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"
Die Erweiterung „intarray“ bietet eigene Operatoren für Integer-Arrays, wie z. B. @>
, während der Index so konzipiert ist, dass er mit den generischen Array-Operatoren funktioniert. Dies kann durch die Verwendung von Schema-qualifizierten Operatoren demonstriert werden:
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"
Weitere Einzelheiten finden Sie in dieser Diskussion:Überladener &&-Operator aus Intarray-Modul verhindert Indexverwendung.
Wenn Sie dennoch die Vorteile der „intarray“-Erweiterung nutzen möchten, können Sie beim Erstellen eines Index eine eigene Operatorklasse „gin__int_ops“ angeben (anstelle des standardmäßigen „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"