2010-11-19 22 views
5
  • J'ai une très grande table.
  • J'ai un index sur les colonnes col1.
  • Je voudrais obtenir les données ordonnées par col1.
  • À partir du plan de requête, je peux dire qu'il n'utilise pas l'index.
  • Lorsque j'ajoute "LIMIT", il commence à utiliser l'index
  • Pour une grande valeur pour "LIMIT", il arrête d'utiliser l'index.

Une idée?Postgres n'utilise pas l'index avec "ORDER BY"

P.S. Je voudrais obtenir les données groupées par des valeurs de col1 (pas nécessairement triées), des suggestions autres que "ORDER BY".

MERCI !!

+2

Où est le résultat de EXPLAIN ANALYZE? Sans cela, personne n'a la moindre idée de la raison pour laquelle les choses ne fonctionnent pas comme vous le pensez. –

Répondre

5

Si vous renvoyez toutes les lignes de la table, une analyse d'index sera plus lente qu'une analyse de table. Pourquoi pensez-vous avoir besoin de l'utilisation de l'index?

Vous pouvez essayer d'utiliser

set enable_seqscan = false

afin de désactiver l'analyse séquentielle, mais je suis sûr que ce sera plus lent qu'avec l'analyse séquentielle.

ORDER BY est la méthode seulement pour trier vos données. Tout autre que vous pourriez voir le tri est une pure coïncidence

Modifier
Pour éclaircir les choses: je ne pas recommander pour arrêter l'examen seq off. Je viens de poster ceci comme un moyen de montrer que l'analyse seq est en effet plus rapide que l'analyse de l'index. Une fois éteint, le plan d'exécution utilisant le balayage d'index sera probablement plus lent que le balayage seq montrant l'OP qu'il n'y a pas besoin d'un balayage d'index.

+0

Supposons qu'il s'agisse d'une table clé-> valeur. Je voudrais retourner toutes les lignes mais les enregistrements ayant la même clé doivent être consécutifs dans le jeu de résultats, mais le tri n'a pas vraiment d'importance. –

+3

Ajoutez ensuite une clause "ORDER BY the_key_column". C'est la seule * façon * fiable de trier vos données –

+0

Très mauvaise idée pour désactiver enable_seqscan, cela ne résout pas le vrai problème. –

4

En plus de la réponse de a_horse_with_no_name:

L'utilisation d'un index est en fait deux opérations distinctes: d'abord la valeur que vous désirez est recherché dans l'index. Dans l'index est l'adresse de l'enregistrement complet qui est alors déréférencé. Les deux opérations sont très rapides pour des requêtes spécifiques.

Si vous avez l'intention d'utiliser la totalité ou la plupart des enregistrements de toute façon, le bénéfice disparaît. Si vous voulez tous les enregistrements et que vous passez par l'index, cela prend plus de temps car pour chaque enregistrement il y a deux recherches. Il est plus facile de courir sur toute la table sans l'index car cela prend une recherche par colonne (oui, je sais, en fait c'est moins que ça parce que des blocs entiers sont lus etc ... Je veux juste garder les choses simples).

+0

Mais en utilisant l'index enregistre le temps de tri, je suppose. –

+0

Non et toute cette explication est pourquoi pas. –

+3

Lisez également la section ["Indexes and ORDER BY"] (http://www.postgresql.org/docs/current/static/indexes-ordering.html) du manuel pour une explication similaire. –