2011-05-09 22 views
5

मैं SQLAlchemy उपयोग कर रहा हूँ (अभिव्यक्ति भाषा, नहीं पूर्ण ORM) MySQL के साथ और कुछ अप्रत्याशित धीमेपन का अनुभव। विशेष रूप से, कुछ ही समय में SQLAlchemy दस बार समय mysql कमांड लाइन से एक ही क्वेरी प्रदर्शन करते हुए बिताया से अधिक है द्वारा एक का चयन क्वेरी प्रदर्शन करते हुए बिताया। cprofile सेरूपरेखा SQL क्वेरी

आउटपुट:

ncalls tottime percall cumtime percall filename:lineno(function) 
100 206.703 2.067 206.703 2.067 {method 'query' of '_mysql.connection' objects} 

MySQL समय: 0.26 सेकंड

आम सहमति है कि वहाँ कुछ SQLAlchemy का उपयोग कर भूमि के ऊपर हो रहा है, लेकिन लगभग नहीं इतना। इस तरह के व्यवहार का कारण बनने के लिए कोई सुझाव?

प्रश्नों फार्म के आम तौर पर कर रहे हैं:

SELECT fieldnames.minage, fieldnames.maxage, fieldnames.race,  
fieldnames.sex, sum(pop.population) AS pop, pop.zip5 
FROM pop 
INNER JOIN fieldnames ON fieldnames.fieldname = pop.fieldname_id 
WHERE fieldnames.race IN ("White alone") 
AND fieldnames.sex IN ("Female") 
AND fieldnames.maxage >=101 
AND fieldnames.minage <=107 
GROUP BY fieldnames.minage, fieldnames.maxage 
+0

सुनिश्चित करें कि आप नहीं सीधे SQLAlchemy के बाद MySQL में क्वेरी को चला रहे हैं यह चलाता है, या परिणाम क्वेरी कैश में किया जाएगा। अगर स्मृति परोसता है, तो रीसेट कैच कैच सबकुछ साफ़ कर देता है। एसक्यूएल कीमिया के माध्यम से इतना अंतर नहीं होना चाहिए। – SteveMc

+0

मैंने प्रश्न पोस्ट करने के ठीक बाद कैशिंग के बारे में सोचा। मैं कैश साफ़ करने के साथ खेल रहा हूं, लेकिन प्रारंभिक परिणाम इंगित करते हैं कि यह मुद्दा नहीं है। – AAmeliorant

+0

नेटवर्क समस्याएं - यदि आप स्थानीय स्तर पर कमांड लाइन से MySQL चला रहे हैं लेकिन आपके एप्लिकेशन का रिमोट है, जो देरी पेश कर सकता है, लेकिन इसे बहुत सारे डेटा और/या धीमे नेटवर्क होना होगा। प्रोफाइलिंग जानकारी कुछ भी sqlalchemy कुछ भी नियम कर सकता है। – SteveMc

उत्तर

1

एक सुस्ती के लिए संभावित कारण - एसक्यूएल कीमिया उपयोग तैयार बयान करता है? यदि हाँ, तो एक कारण है कि आप प्रदर्शन में एक फर्क अनुभव कर सकती है mysql अनुकूलक जब दो क्वेरी की योजना बनाने अलग जानकारी है क्योंकि।

जब आप कमांड लाइन से क्वेरी चलाते हैं, तो mysql अनुकूलक के पास पूर्ण क्वेरी है जहां से क्लॉज मान भरते हैं (जैसा कि आपने ऊपर दिखाया है), इस प्रकार इन मानों के लिए स्पष्ट रूप से अनुकूलित कर सकते हैं।

जब आप एसक्यूएल रसायन विद्या से चलाने के लिए, mysql अनुकूलक केवल देख सकते हैं इस (शायद fieldnames.race और fieldnames.sex रूप में अच्छी तरह parameterized हैं):

SELECT fieldnames.minage, fieldnames.maxage, fieldnames.race,  
fieldnames.sex, sum(pop.population) AS pop, pop.zip5 
FROM pop 
INNER JOIN fieldnames ON fieldnames.fieldname = pop.fieldname_id 
WHERE fieldnames.race IN ("White alone") 
AND fieldnames.sex IN ("Female") 
AND fieldnames.maxage >= ? 
AND fieldnames.minage <= ? 
GROUP BY fieldnames.minage, fieldnames.maxage 

इस प्रकार अनुकूलक पर एक अनुमान लगाने के लिए है क्या मूल्य जो आप उपयोग कर सकते हैं उसके बाद अनुकूलित करें। दुर्भाग्य से, यह एक बुरा अनुमान लगाने के लिए कर सकते हैं, और इस तरह एक सबसे खराब स्थिति में एक प्रश्न योजना है कि क्वेरी रन काफी धीमी आपकी अपेक्षा से बनाता पैदा करते हैं।