Pernyataan kedua memakan waktu lama karena harus memindai seluruh tabel untuk menghitung baris.
Satu hal yang dapat Anda lakukan adalah menggunakan indeks:
CREATE INDEX ON tbl_oplog (deleted) INCLUDE (id);
VACUUM tbl_oplog; -- so you get an index only scan
Dengan asumsi bahwa id
adalah kunci utama, akan jauh lebih baik menggunakan count(*)
dan hilangkan INCLUDE
klausa dari indeks.
Tapi yang terbaik mungkin menggunakan perkiraan:
SELECT t.reltuples * freq.f AS estimated_rows
FROM pg_stats AS s
JOIN pg_namespace AS n
ON s.schemaname = n.nspname
JOIN pg_class AS t
ON s.tablename = t.relname
AND n.oid = t.relnamespace
CROSS JOIN LATERAL
unnest(s.most_common_vals::text::boolean[]) WITH ORDINALITY AS val(v,id)
JOIN LATERAL
unnest(s.most_common_freqs) WITH ORDINALITY AS freq(f,id)
USING (id)
WHERE s.tablename = 'tbl_oplog'
AND s.attname = 'deleted'
AND val.v = ?;
Ini menggunakan statistik distribusi untuk memperkirakan jumlah yang diinginkan.
Jika ini hanya tentang pagination, Anda tidak perlu menghitung dengan tepat.
Baca blog saya untuk informasi lebih lanjut tentang topik penghitungan di PostgreSQL.