I saw in the documentation the difference between count(*)
and count(pk)
. I had been using count(pk)
(where pk
is a SERIAL PRIMARY KEY
) not knowing about the existence of count(*)
.
My question is about Postgres' internal optimizations. Is it smart enough to pick up that a SERIAL PRIMARY KEY
is going to exist in every row and never be false and just count rows or will it do redundant predicate checks for each row? I agree that this is probably too much of a pointless optimization but I'm just curious.
I took a look at the output of EXPLAIN
and EXPLAIN VERBOSE
for count(*)
, count(id)
and count(id > 50)
to see if EXPLAIN
mentioned checking the predicates in its output. It doesn't.