शुद्ध SQL
2008 के बाद से चीजें बदल गई हैं। पूरी गिनती प्राप्त करने के लिए आप विंडो फ़ंक्शन का उपयोग कर सकते हैं और एक प्रश्न में सीमित परिणाम। 2009 में PostgreSQL 8.4 के साथ पेश किया गया।
SELECT foo
, count(*) OVER() AS full_count
FROM bar
WHERE <some condition>
ORDER BY <some col>
LIMIT <pagesize>
OFFSET <offset>;
ध्यान दें कि यह बिना कुल संख्या के काफी अधिक महंगा हो सकता है . सभी पंक्तियों को गिनना पड़ता है, और एक मेल खाने वाली अनुक्रमणिका से केवल शीर्ष पंक्तियों को लेने वाला एक संभावित शॉर्टकट अब सहायक नहीं हो सकता है।
छोटी तालिकाओं या full_count
के साथ ज्यादा मायने नहीं रखता है <=OFFSET
+ LIMIT
. काफी बड़े full_count
. के लिए मायने रखता है ।
कोने का मामला :जब OFFSET
आधार क्वेरी से कम से कम पंक्तियों की संख्या जितनी बड़ी है, कोई पंक्ति नहीं वापस किया जाता है। तो आपको कोई full_count
भी नहीं मिलता है . संभावित विकल्प:
- एक LIMIT/OFFSET के साथ एक क्वेरी चलाएँ और पंक्तियों की कुल संख्या भी प्राप्त करें
एक SELECT
में इवेंट का क्रम क्वेरी
( 0. सीटीई का मूल्यांकन और अलग से अमल किया जाता है। पोस्टग्रेज 12 या बाद के संस्करण में योजनाकार काम पर जाने से पहले उन सबक्वायरियों को इनलाइन कर सकते हैं।) यहां नहीं।
WHERE
खंड (औरJOIN
शर्तें, हालांकि आपके उदाहरण में कोई नहीं) आधार तालिका (तालिकाओं) से योग्यता पंक्तियों को फ़िल्टर करें। शेष फ़िल्टर किए गए सबसेट पर आधारित है।
( 2. GROUP BY
और समग्र कार्य यहां जाएंगे।) यहां नहीं।
(3. अन्य SELECT
सूची के भावों का मूल्यांकन समूहीकृत / एकत्रित स्तंभों के आधार पर किया जाता है।) यहाँ नहीं।
-
विंडो फ़ंक्शन
OVER
. के आधार पर लागू होते हैं खंड और समारोह के फ्रेम विनिर्देश। सरलcount(*) OVER()
सभी योग्य पंक्तियों पर आधारित है। -
ORDER BY
( 6. DISTINCT
या DISTINCT ON
यहाँ जाना होगा।) यहाँ नहीं।
LIMIT
/OFFSET
वापसी के लिए पंक्तियों का चयन करने के लिए स्थापित क्रम के आधार पर लागू किया जाता है।
LIMIT
/ OFFSET
तालिका में पंक्तियों की बढ़ती संख्या के साथ तेजी से अक्षम हो जाता है। यदि आपको बेहतर प्रदर्शन की आवश्यकता है तो वैकल्पिक तरीकों पर विचार करें:
- बड़ी टेबल पर OFFSET के साथ क्वेरी को ऑप्टिमाइज़ करें
अंतिम गणना प्राप्त करने के विकल्प
प्रभावित पंक्तियों की संख्या प्राप्त करने के लिए पूरी तरह से अलग तरीके हैं (नहीं OFFSET
. से पहले की पूरी गिनती और LIMIT
लागू किया गया था)। Postgres में आंतरिक बहीखाता पद्धति है, जहां अंतिम SQL कमांड से कितनी पंक्तियाँ प्रभावित होती हैं। कुछ क्लाइंट उस जानकारी तक पहुँच सकते हैं या पंक्तियों को स्वयं गिन सकते हैं (जैसे psql)।
उदाहरण के लिए, आप plpgsql . में प्रभावित पंक्तियों की संख्या पुनः प्राप्त कर सकते हैं SQL कमांड को निष्पादित करने के तुरंत बाद:
GET DIAGNOSTICS integer_var = ROW_COUNT;
मैनुअल में विवरण।
या आप pg_num_rows
. का उपयोग कर सकते हैं PHP . में . या अन्य क्लाइंट में समान कार्य।
संबंधित:
- PostgreSQL में बैच क्वेरी से प्रभावित पंक्तियों की संख्या की गणना करें