दूसरे कथन में लंबा समय लगता है क्योंकि पंक्तियों को गिनने के लिए उसे पूरी तालिका को स्कैन करना पड़ता है।
एक चीज जो आप कर सकते हैं वह है एक इंडेक्स का उपयोग करना:
CREATE INDEX ON tbl_oplog (deleted) INCLUDE (id);
VACUUM tbl_oplog; -- so you get an index only scan
मान लें कि id
प्राथमिक कुंजी है, इसका उपयोग करना बेहतर होगा count(*)
और INCLUDE
. को छोड़ दें इंडेक्स से क्लॉज।
लेकिन अनुमान का उपयोग करना शायद सबसे अच्छा है:
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 = ?;
यह वांछित गणना का अनुमान लगाने के लिए वितरण आंकड़ों का उपयोग करता है।
यदि यह केवल पृष्ठ पर अंक लगाने के बारे में है, तो आपको सटीक गणना की आवश्यकता नहीं है।
पढ़ें मेरा ब्लॉग PostgreSQL में गिनती के विषय पर अधिक जानकारी के लिए।