Saya melihat dalam dokumentasi perbedaan antara count(*)
dan count(pk)
. Saya telah menggunakan count(pk)
(di mana pk
a SERIAL PRIMARY KEY
) tidak tahu tentang keberadaan count(*)
.
Pertanyaan saya adalah tentang optimalisasi internal Postgres. Apakah cukup pintar untuk mengambil bahwa a SERIAL PRIMARY KEY
akan ada di setiap baris dan tidak pernah salah dan hanya menghitung baris atau akankah ia melakukan pemeriksaan predikat berlebihan untuk setiap baris? Saya setuju bahwa ini mungkin terlalu banyak optimasi yang tidak berguna, tetapi saya hanya ingin tahu.
Saya melihat pada output dari EXPLAIN
dan EXPLAIN VERBOSE
untuk count(*)
, count(id)
dan count(id > 50)
untuk melihat apakah EXPLAIN
disebutkan memeriksa predikat dalam outputnya. Tidak.
NOT NULL
kolom, perbedaannya besar jika Anda memiliki banyak baris. Dalam kasus kami dengan jutaan baris,COUNT(*)
3 kali lebih cepat. (Postgres 9.4)