PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres n'utilise pas l'index sur le tableau d'entiers si l'extension intarray est installée

Cela se produit si vous avez installé le "intarray ". Testons-la :

drop extension intarray;

explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"

L'extension "intarray" fournit ses propres opérateurs pour les tableaux d'entiers, tels que @> , tandis que l'index est conçu pour fonctionner avec les opérateurs de tableau génériques. Cela peut être démontré en utilisant des opérateurs qualifiés de schéma :

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"

Voir cette discussion pour plus de détails :L'opérateur &&surchargé du module intarray empêche l'utilisation de l'index.

Si vous souhaitez toujours profiter de l'extension "intarray", vous pouvez spécifier sa propre classe d'opérateur "gin__int_ops" lors de la création d'un index (au lieu de la valeur par défaut "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"