PostgreSQL: COUNT (*) utilise un scan séquentiel, pas un index


12

Pourquoi PostgreSQL analyse-t-il séquentiellement la table pour COUNT(*)rechercher des requêtes, alors qu'il existe une clé primaire très petite et indexée?

Réponses:


15

Les pages wiki officielles donnent une réponse à cela:

[...] La raison pour laquelle cela est lent est liée à l'implémentation MVCC dans PostgreSQL. Le fait que plusieurs transactions puissent voir différents états des données signifie qu'il ne peut y avoir aucun moyen simple pour "COUNT (*)" de résumer les données sur l'ensemble du tableau; PostgreSQL doit parcourir toutes les lignes, dans un certain sens. Cela se traduit normalement par une analyse séquentielle de la lecture des informations sur chaque ligne du tableau. [...]

De plus, vous pouvez essayer une ANALYSE pour reconstruire les informations du planificateur de requêtes.

Vous devriez obtenir de meilleures performances en utilisant COUNT(an uniquly indexed field)mais si c'est très gros, un scan seq est le seul moyen de le faire.

Si vous avez besoin de numéros très rapides et n'avez pas peur d'interroger le schéma, vous pouvez effectuer les opérations suivantes

SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass

Mais ne vous fiez pas à ces valeurs car il ne s'agit que d'un nombre "estimé" (bien que souvent exact) de tuples dans le tableau.


Je ne pense pas que ce soit correct. Je n'ai rien lu nulle part, où COUNT(pk)améliorera les performances. Je pense qu'il fera toujours un seq-scan
vol7ron

1
Sans clause where, vous avez raison, une analyse séquentielle sera effectuée. Avec une clause selectg où suffisamment postgresql PEUT utiliser un index, mais gardez à l'esprit qu'il va retourner à la table pour vérifier la visibilité des tuples sur lesquels il fait rapport.
Scott Marlowe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.