PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres verwendet keinen Index für ein Integer-Array, wenn die Intarray-Erweiterung installiert ist

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"