Question

J'ai une table avec une colonne c, qui est un int et a un index btree sur elle.

Pourquoi la requête suivante ne pas utiliser cet indice?

explain select c from t group by c;

Le résultat que j'obtiens est:

HashAggregate  (cost=1005817.55..1005817.71 rows=16 width=4)
  ->  Seq Scan on t  (cost=0.00..946059.84 rows=23903084 width=4)

Ma compréhension de l'index est limité, mais je pensais que ces requêtes ont été le but de l'index.

Était-ce utile?

La solution

La requête ne peut certainement utiliser un index.La raison qu'il ne fonctionne pas dans votre cas particulier dépend de la taille et de la distribution des données.Vous pouvez utiliser SET enable_seqscan TO off pour étudier.

Autres conseils

Cette requête peut être effectuée à l'aide d'une optimisation appelée Analyse d'index Loose .Cependant, PostgreSQL n'applique pas encore cette optimisation, il utilise donc une numérisation de table.

des principales bases de données, autant que je ne connaisse que MySQL a mis en œuvre la numérisation d'index desserré (peut-être Oracle aussi?).PostgreSQL n'a pas implémentée cette fonctionnalité.

Parce que cela nécessite de numériser toute la table, le faisant ainsi via l'index est d'aucun avantage.(«Indices de couverture» ne sont pas utiles comme une technique de performance dans PostgreSQL en raison de sa mise en œuvre MVCC).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top