J'ai vu dans la documentation la différence entre count(*)
et count(pk)
. J'avais utilisé count(pk)
(où pk
est a SERIAL PRIMARY KEY
) sans savoir l'existence de count(*)
.
Ma question concerne les optimisations internes de Postgres. Est-il suffisamment intelligent pour SERIAL PRIMARY KEY
comprendre qu'un va exister dans chaque ligne et ne jamais être faux et simplement compter les lignes ou fera-t-il des vérifications de prédicat redondantes pour chaque ligne? Je suis d'accord que c'est probablement trop d'une optimisation inutile, mais je suis juste curieux.
J'ai jeté un coup d'œil à la sortie de EXPLAIN
et EXPLAIN VERBOSE
pour count(*)
, count(id)
et count(id > 50)
voir s'il était EXPLAIN
mentionné de vérifier les prédicats dans sa sortie. Ce n'est pas le cas.
NOT NULL
colonne, la différence est grande si vous avez beaucoup de lignes. Dans notre cas avec des millions de lignes,COUNT(*)
c'est 3 fois plus rapide. (Postgres 9.4)