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