Nous avons une table avec une colonne de tableau indexée :
CREATE TABLE mention (
id SERIAL,
phraseIds integer[],
PRIMARY KEY (id)
);
CREATE INDEX indx_mentions_phraseIds on mention USING GIN (phraseids public.gin__int_ops);
Les requêtes utilisant l'opérateur "overlaps" sur cette colonne ne semblent pas utiliser l'index :
explain analyze select m.id FROM mention m WHERE m.phraseIds && ARRAY[11638,11639];
Seq Scan on mention m (cost=0.00..933723.44 rows=1404 width=4) (actual time=103.018..3751.525 rows=1101 loops=1)
Filter: (phraseids && '{11638,11639}'::integer[])
Rows Removed by Filter: 7019974
Total runtime: 3751.618 ms
Est-il possible de faire en sorte que Postgresql utilise l'index ? Ou devrions-nous faire quelque chose d'autre ?
Mise à jour : J'ai répété le test avec 'SET enable_seqscan TO off' et l'index n'est toujours pas utilisé.
Mise à jour : J'aurais dû mentionner que j'utilise la version 9.2 avec l'extension intarray.
Mise à jour : Il semble que l'extension intarray soit une partie de ce problème. J'ai recréé la table sans utiliser l'extension intarray et l'index est utilisé comme prévu. Quelqu'un sait comment faire en sorte que l'index soit utilisé avec l'extension intarray ? Les docs (http://www.postgresql.org/docs/9.2/static/intarray.html) disent que les index sont supportés pour &&.