2011-11-26 13 views
7

मेरे पास एक प्रश्न है जो लगभग 2 वर्षों तक ठीक चल रहा है। डेटाबेस तालिका में लगभग 50 मिलियन पंक्तियां हैं, और धीरे-धीरे बढ़ रही हैं। पिछले हफ्ते मेरे प्रश्नों में से एक लगभग तुरंत चलने के लिए घंटों तक लौटने से चला गया।सरल क्वेरी साल के लिए काम कर रही है, तो अचानक बहुत धीमी

Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).latest('id') 

मैंने धीमी क्वेरी को रैंक मॉडल तक सीमित कर दिया है। ऐसा लगता है कि नवीनतम() विधि का उपयोग करने के साथ कुछ करना है। अगर मैं सिर्फ एक क्वेरीसेट मांगता हूं, तो यह तुरंत एक खाली क्वेरीसेट देता है।

#count returns 0 and is fast 
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).count() == 0 
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)) == [] #also very fast 

एक्स्पलाइन चलाने के परिणाम यहां दिए गए हैं। http://explain.depesz.com/s/wPh

और विश्लेषण व्याख्या: http://explain.depesz.com/s/ggi

मैं मेज, कोई परिवर्तन नहीं सफाई की कोशिश की। "साइट" फ़ील्ड (विदेशीकी) पर पहले से ही एक सूचकांक है।

अजीब, अगर मैं एक और ग्राहक पहले से ही उसके खाते से संबद्ध वस्तुओं रैंक वाले के लिए यह एक ही क्वेरी चलाने, फिर क्वेरी बहुत जल्दी एक बार फिर से वापस आती है। तो ऐसा लगता है कि यह केवल एक समस्या है जब वे उस ग्राहक के लिए कोई रैंक ऑब्जेक्ट नहीं हैं।

कोई भी विचार?

संस्करण: Postgres 9.1, Django 1.4 SVN ट्रंक फिरना 17047

उत्तर

0

ठीक है, आपने वास्तविक SQL नहीं दिखाया है, जिससे यह सुनिश्चित करना मुश्किल हो जाता है। लेकिन, समझाते हुए आउटपुट से पता चलता है कि यह सोचता है कि मैच खोजने का सबसे तेज़ तरीका है "आईडी" पर एक इंडेक्स स्कैन करके जब तक कि ग्राहक क्लाइंट को प्रश्न में न मिल जाए।

जब से तुम ने कहा कि यह तेजी से हाल ही में जब तक किया गया है, यह शायद एक मूर्खतापूर्ण विकल्प नहीं है। हालांकि, हमेशा यह संभावना है कि इस खोज के बहुत दूर एक विशेष ग्राहक का रिकॉर्ड सही होगा।

तो - दो बातें पहली कोशिश:

  1. भागो एक सवाल में मेज पर विश्लेषण, देखना है कि अगर योजनाकार पर्याप्त जानकारी देता है।
  2. यदि नहीं, प्रश्नों के कॉलम पर आंकड़े (वैकल्पिक तालिका ... सेट सांख्यिकी) बढ़ाएं और पुन: विश्लेषण करें। देखें कि क्या यह करता है।

http://www.postgresql.org/docs/9.1/static/planner-stats.html

हैं कि अभी भी मदद नहीं कर रहा है, तो (ग्राहक, आईडी) पर एक सूचकांक पर विचार करें, और आईडी पर सूचकांक ड्रॉप (अगर कहीं और की जरूरत नहीं)। इससे आपको बिजली तेज जवाब देना चाहिए।

+0

आदेश द्वारा में WHERE में मैदान पर एक यौगिक सूचकांक के साथ ही क्षेत्र की स्थापना चाल किया था। क्वेरी प्लानर को सॉर्ट करने के लिए पूरे इंडेक्स के माध्यम से स्कैनिंग कर रहा था, और फिर फ़िल्टर कर रहा था। यौगिक सूचकांक चाल है। – erikcw

0

latests सामान्य रूप से तारीख की तुलना के लिए प्रयोग किया जाता है, हो सकता है आप आईडी desc द्वारा ऑर्डर करने के लिए प्रयास करना चाहिए और फिर एक के लिए सीमा।

+0

मुझे लगता है कि कोशिश की और वहाँ भी एक इसी तरह लंबे समय से देरी था। जब मैं ओआरएम द्वारा उत्पन्न कच्चे एसक्यूएल को देखता हूं, तो दोनों बराबर आउटपुट उत्पन्न करते हैं। – erikcw

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