Het tweede statement duurt lang omdat het de hele tabel moet scannen om de rijen te tellen.
Een ding dat u kunt doen, is een index gebruiken:
CREATE INDEX ON tbl_oplog (deleted) INCLUDE (id);
VACUUM tbl_oplog; -- so you get an index only scan
Ervan uitgaande dat id
de primaire sleutel is, zou het veel beter zijn om count(*)
. te gebruiken en laat de INCLUDE
. weg clausule uit de index.
Maar het beste is waarschijnlijk om een schatting te gebruiken:
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 = ?;
Dit gebruikt de distributiestatistieken om het gewenste aantal te schatten.
Als het alleen om paginering gaat, heb je geen exacte tellingen nodig.
Lees mijn blog voor meer informatie over tellen in PostgreSQL.