Vi na documentação a diferença entre count(*)e count(pk). Eu estava usando count(pk)(onde pkestá a SERIAL PRIMARY KEY) não saber sobre a existência de count(*).
Minha pergunta é sobre as otimizações internas do Postgres. É inteligente o suficiente perceber que SERIAL PRIMARY KEYa existirá em todas as linhas e nunca será falso e apenas contará linhas ou fará verificações de predicado redundantes para cada linha? Concordo que isso provavelmente é uma otimização sem sentido, mas estou curioso.
Dei uma olhada na saída de EXPLAINe EXPLAIN VERBOSEpara count(*), count(id)e count(id > 50)para ver se EXPLAINmencionou a verificação dos predicados em sua saída. Não faz.