PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

LIMIT लागू होने से पहले परिणाम गणना प्राप्त करने का सबसे अच्छा तरीका

शुद्ध 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 या बाद के संस्करण में योजनाकार काम पर जाने से पहले उन सबक्वायरियों को इनलाइन कर सकते हैं।) यहां नहीं।

  1. WHERE खंड (और JOIN शर्तें, हालांकि आपके उदाहरण में कोई नहीं) आधार तालिका (तालिकाओं) से योग्यता पंक्तियों को फ़िल्टर करें। शेष फ़िल्टर किए गए सबसेट पर आधारित है।

( 2. GROUP BY और समग्र कार्य यहां जाएंगे।) यहां नहीं।

(3. अन्य SELECT सूची के भावों का मूल्यांकन समूहीकृत / एकत्रित स्तंभों के आधार पर किया जाता है।) यहाँ नहीं।

  1. विंडो फ़ंक्शन OVER . के आधार पर लागू होते हैं खंड और समारोह के फ्रेम विनिर्देश। सरल count(*) OVER() सभी योग्य पंक्तियों पर आधारित है।

  2. ORDER BY

( 6. DISTINCT या DISTINCT ON यहाँ जाना होगा।) यहाँ नहीं।

  1. LIMIT / OFFSET वापसी के लिए पंक्तियों का चयन करने के लिए स्थापित क्रम के आधार पर लागू किया जाता है।

LIMIT / OFFSET तालिका में पंक्तियों की बढ़ती संख्या के साथ तेजी से अक्षम हो जाता है। यदि आपको बेहतर प्रदर्शन की आवश्यकता है तो वैकल्पिक तरीकों पर विचार करें:

  • बड़ी टेबल पर OFFSET के साथ क्वेरी को ऑप्टिमाइज़ करें

अंतिम गणना प्राप्त करने के विकल्प

प्रभावित पंक्तियों की संख्या प्राप्त करने के लिए पूरी तरह से अलग तरीके हैं (नहीं OFFSET . से पहले की पूरी गिनती और LIMIT लागू किया गया था)। Postgres में आंतरिक बहीखाता पद्धति है, जहां अंतिम SQL कमांड से कितनी पंक्तियाँ प्रभावित होती हैं। कुछ क्लाइंट उस जानकारी तक पहुँच सकते हैं या पंक्तियों को स्वयं गिन सकते हैं (जैसे psql)।

उदाहरण के लिए, आप plpgsql . में प्रभावित पंक्तियों की संख्या पुनः प्राप्त कर सकते हैं SQL कमांड को निष्पादित करने के तुरंत बाद:

GET DIAGNOSTICS integer_var = ROW_COUNT;

मैनुअल में विवरण।

या आप pg_num_rows . का उपयोग कर सकते हैं PHP . में . या अन्य क्लाइंट में समान कार्य।

संबंधित:

  • PostgreSQL में बैच क्वेरी से प्रभावित पंक्तियों की संख्या की गणना करें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में ओवरलैपिंग तिथियों के लिए परीक्षण कैसे करें

  2. जेपीए अपरकेस टेबल नाम

  3. Postgres में टाइमस्टैम्प को 5 मिनट तक छोटा करने का सबसे तेज़ तरीका क्या है?

  4. PostgreSQL डेटाबेस में रिमोट एक्सेस की अनुमति कैसे दें

  5. PostgreSQL WHERE क्लॉज में कॉलम उपनाम स्वीकार नहीं करता है