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

1,000,000 डेटाबेस परिणामों के साथ API क्लाइंट कैसे प्रदान करें?

तालिका में प्राथमिक कुंजी है। इसका उपयोग करें।

LIMIT . के बजाय और OFFSET , प्राथमिक कुंजी पर फ़िल्टर के साथ अपना पेजिंग करें। आपने अपनी टिप्पणी से इसका संकेत दिया:

<ब्लॉकक्वॉट>

यादृच्छिक संख्याओं का उपयोग करके पेजिंग (प्रत्येक क्वेरी में "ऑर्डर से अधिक" जोड़ें)

लेकिन आपको इसे कैसे करना चाहिए, इसके बारे में कुछ भी यादृच्छिक नहीं है।

SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2

क्लाइंट को दोनों पैरामीटर, उसके द्वारा देखी गई अंतिम आईडी और लाने के लिए रिकॉर्ड की संख्या निर्दिष्ट करने दें। आपके एपीआई में या तो एक प्लेसहोल्डर, अतिरिक्त पैरामीटर या "फ़ेच द पहले के लिए वैकल्पिक कॉल होना चाहिए। n आईडी" जहां यह WHERE . को छोड़ देता है क्वेरी से खंड, लेकिन यह तुच्छ है।

यह दृष्टिकोण रिकॉर्ड को क्रम में प्राप्त करने के लिए काफी कुशल इंडेक्स स्कैन का उपयोग करेगा, आम तौर पर एक प्रकार से बचने या सभी छोड़े गए रिकॉर्ड्स के माध्यम से पुनरावृति करने की आवश्यकता से बचने के लिए। क्लाइंट यह तय कर सकता है कि उसे एक बार में कितनी पंक्तियाँ चाहिए।

यह दृष्टिकोण LIMIT . से भिन्न है और OFFSET एक प्रमुख तरीके से दृष्टिकोण:समवर्ती संशोधन। अगर आप INSERT एक कुंजी के साथ तालिका में निचला एक कुंजी की तुलना में कुछ क्लाइंट पहले ही देख चुका है, यह दृष्टिकोण अपने परिणामों को बिल्कुल भी नहीं बदलेगा, जबकि OFFSET दृष्टिकोण एक पंक्ति दोहराएगा। इसी तरह, अगर आप DELETE कम-से-पहले से देखी गई आईडी वाली एक पंक्ति इस दृष्टिकोण के परिणाम नहीं बदलेगी, जबकि OFFSET एक अनदेखी पंक्ति को छोड़ देगा। हालांकि, जेनरेट की गई कुंजियों वाली केवल संलग्न तालिकाओं के लिए कोई अंतर नहीं है।

यदि आप पहले से जानते हैं कि क्लाइंट पूरे परिणाम सेट को चाहता है, तो सबसे कुशल काम यह है कि उन्हें इस पेजिंग व्यवसाय में से कोई भी पूरा परिणाम सेट न भेजें। वहीं मैं करता एक कर्सर का प्रयोग करें। डीबी से पंक्तियों को पढ़ें और उन्हें क्लाइंट को उतनी ही तेजी से भेजें जितना क्लाइंट उन्हें स्वीकार करेगा। इस एपीआई को अत्यधिक बैकएंड लोड से बचने के लिए क्लाइंट को कितनी धीमी गति से चलने की अनुमति दी गई थी, इस पर सीमाएं निर्धारित करने की आवश्यकता होगी; धीमे क्लाइंट के लिए मैं शायद पेजिंग पर स्विच करूंगा (जैसा कि ऊपर वर्णित है) या पूरे कर्सर को एक अस्थायी फ़ाइल में स्पूल करता हूं और डीबी कनेक्शन बंद कर देता हूं।

महत्वपूर्ण चेतावनी :

  • एक UNIQUE की आवश्यकता है बाधा / UNIQUE अनुक्रमणिका या PRIMARY KEY विश्वसनीय होना
  • विभिन्न समवर्ती संशोधन व्यवहार को सीमित/ऑफ़सेट करने के लिए, ऊपर देखें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Psycopg2, Postgresql, Python:थोक-सम्मिलित करने का सबसे तेज़ तरीका

  2. Postgres प्रारंभ नहीं किया जा सकता

  3. एक ट्रिगर फ़ंक्शन के भीतर, कैसे प्राप्त करें कि कौन से फ़ील्ड अपडेट किए जा रहे हैं

  4. Plpgsql में सरणी आयाम पर लूप करें

  5. कैसे PostgreSQL तालिका के लिए पांडा DataFrame upsert करने के लिए?