W dokumentacji widziałem różnicę między count(*)
i count(pk)
. Korzystałem count(pk)
(gdzie pk
a SERIAL PRIMARY KEY
) nie wiedząc o istnieniu count(*)
.
Moje pytanie dotyczy wewnętrznych optymalizacji Postgres. Czy jest wystarczająco mądry, aby stwierdzić, że a SERIAL PRIMARY KEY
będzie istniał w każdym rzędzie i nigdy nie będzie fałszywy i po prostu policzy wiersze, czy też będzie przeprowadzać zbędne sprawdzanie predykatów dla każdego wiersza? Zgadzam się, że jest to chyba zbytnia bezcelowa optymalizacja, ale jestem po prostu ciekawy.
Wziąłem spojrzeć na wyjściu EXPLAIN
i EXPLAIN VERBOSE
na count(*)
, count(id)
i count(id > 50)
zobaczyć, czy EXPLAIN
wspomniane sprawdzania predykatów w swoim wyjściu. Tak nie jest.
NOT NULL
kolumną różnica jest duża, jeśli masz dużo wierszy. W naszym przypadku z milionami rzędówCOUNT(*)
jest 3 razy szybszy. (Postgres 9.4)