web-dev-qa-db-fra.com

PostgreSQL: Count (*) utilise une analyse séquentielle, pas l'index

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

12
Adam Matan

Les pages de wiki officielles Donnez une réponse à cela:

[...] La raison pour laquelle cela est lent est lié à la mise en œuvre de la MVCC dans PostgreSQL. Le fait que plusieurs transactions puissent voir différents états des données signifie qu'il ne peut y avoir de manière simple pour "Compter (*)" de résumer les données sur toute la table; PostgreSQL doit traverser toutes les lignes, en quelque sorte. Cela entraîne normalement une analyse séquentielle des informations de lecture sur chaque rangée de la table. [...]

De plus, vous pouvez essayer un ANALYSER Pour reconstruire les informations de la planeur de requête.

Vous devriez avoir une meilleure performance à l'aide de COUNT(an uniquly indexed field) mais si c'est très grand, une scanner SEQ est la seule façon de le faire.

Si vous avez besoin de nombres très rapides et que vous n'avez pas peur d'interroger le schéma, vous pouvez faire ce qui suit.

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

Mais ne reposez pas sur ces valeurs car ce n'est qu'un nombre "estimé" (bien que souvent exactement) nombre de tuples dans la table.

16
DrColossos