Я видел в документации разницу между count(*)а count(pk). Я использовал count(pk)(где pkэто SERIAL PRIMARY KEY), не зная о существовании count(*).
Мой вопрос касается внутренних оптимизаций Postgres. Достаточно ли умен, чтобы понять, что a SERIAL PRIMARY KEYбудет существовать в каждой строке и никогда не быть ложным, и просто считать строки, или он будет выполнять избыточные проверки предикатов для каждой строки? Я согласен, что это, вероятно, слишком бессмысленная оптимизация, но мне просто любопытно.
Я посмотрел на выходные данные EXPLAINи EXPLAIN VERBOSEдля count(*), count(id)и count(id > 50)посмотреть, если EXPLAINупомянуто проверка предикатов в его выводе. Это не так.