2012-10-30 11 views
11

मेरे पिछले सवाल से ऊपर के बाद:1,000,000 डेटाबेस परिणामों के साथ एपीआई क्लाइंट कैसे प्रदान करें?

Using "Cursors" for paging in PostgreSQL

साथ 1,000,000 डेटाबेस परिणाम एक API ग्राहक प्रदान करने के लिए एक अच्छा तरीका क्या है?

हम वर्तमान में PostgreSQL का उपयोग कर रहे हैं। कुछ सुझाव दिया तरीके:

  • का उपयोग कर Cursors
  • पेजिंग यादृच्छिक संख्या का उपयोग कर पेजिंग ("ग्रेटर आदेश से ज़्यादा" जोड़ें प्रत्येक प्रश्न के लिए) सीमित उपयोग
  • पेजिंग और ऑफसेट (बहुत बड़े डेटा सेट के लिए टूट जाती है) एक फाइल करने के लिए
  • जानकारी सहेजें और ग्राहक ग्राहक के लिए परिणामों के माध्यम से यह
  • दोहराएं डाउनलोड करें, फिर
  • वापसी केवल कुंजी क्लाइंट सर्वर को डेटा पोस्ट करने दें, तो requ ग्राहक जाने अमेज़ॅन एस 3 जैसे क्लाउड फाइलों की ऑब्जेक्ट्स (अभी भी फ़ाइल नाम प्राप्त करने के लिए पेजिंग की आवश्यकता हो सकती है)।

मुझे लगता है कि किस बारे में नहीं सोचा stupidly सरल और जिस तरह इन विकल्पों में से किसी की तुलना में बेहतर है?

उत्तर

24

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

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

यादृच्छिक संख्या का उपयोग कर पेजिंग (जोड़ें "ग्रेटर आदेश से ज़्यादा" प्रत्येक क्वेरी के लिए)

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

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

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

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

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

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

महत्वपूर्ण चेतावनियां:

  • आवश्यक है एक UNIQUE बाधा/UNIQUE सूचकांक या PRIMARY KEY विश्वसनीय
  • विभिन्न समवर्ती संशोधन व्यवहार होने के लिए सीमित करने के लिए/ऑफसेट, ऊपर
1

क्या एपीआई शुरू करने के लिए ऑफ़सेट स्वीकार करता है और रिकॉर्ड्स की संख्या वापस लौटाता है। यह एक प्रकार का पेजिंग है जहां ग्राहक निर्धारित कर सकता है कि एक पृष्ठ अनुरोध में कितने रिकॉर्ड लौट सकते हैं। एपीआई को क्वेरी के लिए रिकॉर्ड्स की कुल संख्या भी वापस करनी चाहिए ताकि ग्राहक जानता है कि कितने "पेज" हैं, या वैकल्पिक रूप से यह प्राप्त हो सकता है जब यह रिकॉर्ड किए गए रिकॉर्ड्स की संख्या शून्य या कम संख्या की संख्या से कम हो जाती है रिकॉर्ड अनुरोध किया। आप अपने SELECT कथन में OFFSET क्लॉज (जिसे पुनर्प्राप्त करना प्रारंभ करने के लिए रिकॉर्ड) और LIMIT क्लॉज (लौटने के लिए रिकॉर्ड्स की संख्या) का उपयोग कर अपने PostgresSQL क्वेरी में इसे नियंत्रित कर सकते हैं।

+3

उपयोग करने के साथ समस्या को देखने ऑफ़सेट यह है कि सर्वर को "LIMIT" से पहले पूरे परिणाम सेट पर पुन: प्रयास करने की आवश्यकता होती है, इसलिए यह बहुत बड़े डेटा सेट के लिए टूट जाती है। मैंने वास्तव में एक एपीआई का उपयोग किया है जिसने ऐसा किया है और लगभग 100,000 परिणामों के बाद हमें डेटा प्राप्त करने में बड़ी समस्याएं थीं। –

संबंधित मुद्दे