10 votes

L'opérateur de chevauchement d'array Postgres (&&) peut-il utiliser un index?

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 &&.

7voto

J'ai construit une table similaire dans PostgreSQL 9.2; la différence était USING GIN (phraseids); Je ne semble pas avoir int_ops disponible dans ce contexte pour une raison quelconque. J'ai chargé quelques milliers de lignes de données aléatoires (ish).

En désactivant enable_seqscan, PostgreSQL a utilisé l'index.

PostgreSQL a calculé que le coût d'un balayage séquentiel était inférieur au coût d'un balayage de tas de bitmap. Le temps réel d'un balayage séquentiel était de 10% le temps réel d'un balayage de tas de bitmap, mais le temps total d'exécution d'un balayage séquentiel était un peu plus long que le temps total d'exécution d'un balayage de tas de bitmap.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X