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

यह Django (1.6) एनोटेट गिनती इतनी धीमी क्यों है?

यह धीमा क्यों है :यदि आपने केवल दो ManyToMany फ़ील्ड द्वारा एनोटेशन . का उपयोग किया है फिर आप एक अवांछित इन सभी तालिकाओं का बड़ा जुड़ाव create बनाते हैं साथ में। मूल्यांकन की जाने वाली पंक्तियों के कार्टेशियन उत्पाद का आकार लगभग Have.objects.count() * Want.objects.count() है . आपने तब लिखा था distinct=True अंततः एक अवैध विशाल परिणाम प्राप्त न करने के लिए डुप्लिकेट किए गए आइटमों की संख्या को प्रतिबंधित करने के लिए।

पुराने Django के लिए ठीक करें:यदि आप केवल queryset.annotate(have_count=Count("have")) का उपयोग करेंगे आपको distinct=True . के बिना सही परिणाम जल्दी मिलेगा या एक ही परिणाम भी अलग के साथ तेजी से। फिर आप स्मृति में पायथन द्वारा दो प्रश्नों के परिणामों को जोड़ सकते हैं।

समाधान Django>=1.11 . में एक अच्छा समाधान संभव है (आपके प्रश्न के दो साल बाद) क्वेरी के साथ . का उपयोग करके दो उपप्रश्न , एक के लिए Have और एक Want . के लिए , सभी एक अनुरोध द्वारा, लेकिन सभी तालिकाओं को एक साथ मिलाने के लिए नहीं।

from django.db.models import Count, OuterRef, Subquery

sq = Collection.objects.filter(pk=OuterRef('pk')).order_by()
have_count_subq = sq.values('have').annotate(have_count=Count('have')).values('have_count')
want_count_subq = sq.values('want').annotate(have_count=Count('want')).values('want_count')
queryset = queryset.annotate(have_count=Subquery(have_count_subq),
                             want_count=Subquery(want_count_subq))

सत्यापित करें :आप str(my_queryset.query) प्रिंट करके धीमी और स्थिर SQL क्वेरी दोनों की जांच कर सकते हैं कि यह ऊपर वर्णित अनुसार है।




  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. एक बहुत ही सरल QUERY पर HAVING को WHERE के साथ संयोजित करने में समस्या आ रही है

  4. क्लाउड विक्रेता डीप-डाइव:DigitalOcean पर PostgreSQL

  5. pgbouncer के लिए कनेक्शन थ्रूपुट कैसे बढ़ाएं?