मैं डेटाबेस में सभी पंक्तियों पर एक बैच ऑपरेशन चला रहा हूं। इसमें प्रत्येक मॉडल का चयन करना और इसमें कुछ करना शामिल है। इसे टुकड़ों में विभाजित करना और इसे खंड से अलग करना समझ में आता है।Django QuerySet के साथ भागों में डेटाबेस को संसाधित करने का सबसे अच्छा तरीका?
मैं वर्तमान में पेजिनेटर का उपयोग कर रहा हूं, क्योंकि यह सुविधाजनक है। इसका मतलब है कि मुझे मूल्यों पर ऑर्डर करने की आवश्यकता है ताकि उन्हें क्रम में पग किया जा सके। यह SQL स्टेटमेंट जेनरेट करता है जिसमें order
और limit
क्लॉज हैं, और प्रत्येक खंड के लिए मुझे लगता है कि पोस्टग्रेस पूरी तालिका को सॉर्ट कर सकता है (हालांकि मैं आंतरिक के बारे में कोई जानकारी नहीं ले सकता)। मुझे पता है कि डेटाबेस लगभग 50% सीपीयू पर है और मुझे लगता है कि select
एस करने के लिए यह बहुत अधिक है।
आरडीएमबीएस/सीपीयू-अनुकूल तरीके से पूरी तालिका में फिर से शुरू करने का सबसे अच्छा तरीका क्या है?
यह मानते हुए कि डेटाबेस की सामग्री बैच ऑपरेशन के दौरान नहीं बदली जाती है।
मतलब यह है कि रिकॉर्ड एक 'sort' खंड के बिना एक ही क्रम में लौटा दिया जाता है। क्या ये सही है? साथ ही, अगर मेरे पास 'मेटा' कक्षा में डिफ़ॉल्ट सॉर्टिंग है तो क्या मैं इसे क्वेरी के लिए किसी भी तरह से हटा सकता हूं? – Joe
@ जो: मूल रूप से आपको एक ही रिकॉर्ड मिलते हैं, लेकिन बिना छेड़छाड़ की जाती है। यदि आपके आईडी-स्पेस में अंतराल हैं, तो रिकॉर्ड्स की संख्या प्रत्येक कॉल के लिए अपेक्षा से कम हो सकती है। जबकि LIMIT/OFFSET के साथ आपको क्रमबद्ध पंक्तियों की एक निश्चित संख्या मिलती है (प्रति तालिका अंतिम कॉल को छोड़कर)। मैं 'मेटा' वर्ग को संभालने का तरीका नहीं हूं, लेकिन आपको अपनी पंक्तियों को LIMIT/OFFSET के लिए ऑर्डर करने की आवश्यकता है। –
इरविन, मुझे सच में खेद है कि मैंने आपका जवाब सही ढंग से नहीं पढ़ा। क्या आप वाकई तेज़ हैं? 'बीच' खंड निश्चित रूप से केवल तभी काम कर सकता है यदि आईडी पहले से ही क्रमबद्ध हो, या यह हर बार एक संपूर्ण टेबल स्कैन करता है? – Joe