हां। एक साधारण विंडो फ़ंक्शन के साथ:
SELECT *, count(*) OVER() AS full_count
FROM tbl
WHERE /* whatever */
ORDER BY col1
OFFSET ?
LIMIT ?
ध्यान रखें कि कुल संख्या के बिना लागत काफी अधिक होगी, लेकिन आम तौर पर दो अलग-अलग प्रश्नों की तुलना में अभी भी सस्ता है। Postgres को वास्तव में सभी पंक्तियों को गिनना . है किसी भी तरह से, जो योग्यता पंक्तियों की कुल संख्या के आधार पर लागत लगाता है। विवरण:
- LIMIT लागू होने से पहले परिणाम गणना प्राप्त करने का सबसे अच्छा तरीका
हालांकि , जैसा कि दानी ने बताया, जब OFFSET
आधार क्वेरी से लौटाई गई पंक्तियों की संख्या कम से कम उतनी ही महान है, कोई पंक्तियाँ वापस नहीं की जाती हैं। इसलिए हमें full_count
भी नहीं मिलता है ।
यदि यह स्वीकार्य नहीं है, तो एक संभावित हमेशा पूर्ण गणना वापस करने का समाधान एक सीटीई और एक OUTER JOIN
. के साथ होगा :
WITH cte AS (
SELECT *
FROM tbl
WHERE /* whatever */
)
SELECT *
FROM (
TABLE cte
ORDER BY col1
LIMIT ?
OFFSET ?
) sub
RIGHT JOIN (SELECT count(*) FROM cte) c(full_count) ON true;
आपको full_count
. के साथ NULL मानों की एक पंक्ति मिलती है अगर OFFSET
बहुत बडा है। वरना, यह पहली क्वेरी की तरह हर पंक्ति में जोड़ा जाता है।
यदि सभी NULL मानों वाली एक पंक्ति एक संभावित वैध परिणाम है, तो आपको offset >= full_count
जांचना होगा खाली पंक्ति की उत्पत्ति को स्पष्ट करने के लिए।
यह अभी भी केवल एक बार आधार क्वेरी निष्पादित करता है। लेकिन यह क्वेरी में अधिक ओवरहेड जोड़ता है और केवल तभी भुगतान करता है जब यह गणना के लिए आधार क्वेरी को दोहराने से कम हो।
यदि अंतिम सॉर्ट ऑर्डर का समर्थन करने वाले इंडेक्स उपलब्ध हैं, तो यह ORDER BY
. को शामिल करने के लिए भुगतान कर सकता है सीटीई में (अनावश्यक रूप से)।