Vi na documentação a diferença entre count(*)
e count(pk)
. Eu estava usando count(pk)
(onde pk
está 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 KEY
a 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 EXPLAIN
e EXPLAIN VERBOSE
para count(*)
, count(id)
e count(id > 50)
para ver se EXPLAIN
mencionou a verificação dos predicados em sua saída. Não faz.
fonte
NOT NULL
coluna, a diferença é grande se você tiver muitas linhas. No nosso caso, com milhões de linhas,COUNT(*)
é 3 vezes mais rápido. (Postgres 9.4)