अधिकांश DBAPI कार्यान्वयन पूरी तरह से बफ़र पंक्तियों के रूप में वे लाए जाते हैं - इसलिए, आमतौर पर SQLAlchemy ORM से पहले भी एक परिणाम की एक पकड़ मिलती है, पूरा परिणाम सेट स्मृति में होता है।
लेकिन फिर, जिस तरह से Query
काम करता है वह यह है कि यह आपकी वस्तुओं पर लौटने से पहले डिफ़ॉल्ट रूप से दिए गए परिणाम को पूरी तरह से लोड करता है। यहाँ का तर्क उन प्रश्नों का संबंध है जो सरल चयन कथनों से अधिक हैं। उदाहरण के लिए, अन्य तालिकाओं में शामिल होते हैं जो एक ही परिणाम सेट में कई बार एक ही वस्तु की पहचान लौटा सकते हैं (उत्सुक लोडिंग के साथ सामान्य), पंक्तियों के पूर्ण सेट को स्मृति में रखने की आवश्यकता होती है ताकि सही परिणाम अन्यथा संग्रह और जैसे वापस आ सकें केवल आंशिक रूप से आबादी हो सकती है।
इसलिए Query
इस व्यवहार को बदलने का एक विकल्प प्रदान करता है yield_per()
। यह कॉल Query
बैचों में पंक्तियों को उत्पन्न करने का कारण होगा , जहाँ आप इसे बैच आकार देते हैं। डॉक्स स्थिति के रूप में, यह केवल तभी उचित है जब आप किसी भी प्रकार के उत्सुक लोडिंग संग्रह नहीं कर रहे हैं, तो यह मूल रूप से है यदि आप वास्तव में जानते हैं कि आप क्या कर रहे हैं। इसके अलावा, यदि अंतर्निहित DBAPI पूर्व-बफ़र्स पंक्तियाँ हैं, तो अभी भी मेमोरी ओवरहेड होगी, इसलिए दृष्टिकोण केवल इसका उपयोग न करने की तुलना में थोड़ा बेहतर होता है।
मैं शायद ही कभी उपयोग करता हूं yield_per()
; इसके बजाय, मैं लिमिट दृष्टिकोण का एक बेहतर संस्करण उपयोग करता हूं जो आप विंडो फ़ंक्शन का उपयोग करके ऊपर सुझाते हैं। LIMIT और OFFSET में एक बहुत बड़ी समस्या है कि बहुत बड़े OFFSET मान क्वेरी को धीमा और धीमा करने का कारण बनते हैं, क्योंकि OFFSET N के कारण N पंक्तियों के माध्यम से पृष्ठ बनाता है - यह एक के बजाय एक ही क्वेरी को पचास बार करने की तरह है, प्रत्येक पढ़ने के लिए पंक्तियों की बड़ी और बड़ी संख्या। विंडो-फंक्शन एप्रोच के साथ, मैं "विंडो" मानों का एक सेट पहले से लाती हूं जो उस तालिका के भाग को संदर्भित करता है जिसे मैं चुनना चाहता हूं। मैं तब व्यक्तिगत सेलेक्ट स्टेटमेंट का उत्सर्जन करता हूं जो प्रत्येक एक समय में उन खिड़कियों में से एक से खींचता है।
विंडो फ़ंक्शन का दृष्टिकोण विकी पर है और मैं इसे बड़ी सफलता के साथ उपयोग करता हूं।
यह भी ध्यान दें: सभी डेटाबेस विंडो फ़ंक्शन का समर्थन नहीं करते हैं; आपको Postgresql, Oracle, या SQL Server की आवश्यकता है। कम से कम Postgresql का उपयोग कर IMHO निश्चित रूप से इसके लायक है - यदि आप एक रिलेशनल डेटाबेस का उपयोग कर रहे हैं, तो आप सबसे अच्छा उपयोग कर सकते हैं।