मैं अपने प्रोजेक्ट के डीबी कॉल के अनुकूलन पर काम कर रहा है और मैं नीचे दो समान कॉल के बीच प्रदर्शन में एक "महत्वपूर्ण" अंतर पर ध्यान:ActiveRecord क्वेरी सीधे एसक्यूएल से धीमी है?
connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
"SELECT SUM(my_column)
FROM table
WHERE id = #{id}
AND created_at BETWEEN '#{lower}' and '#{upper}'")
और दूसरे संस्करण:
sum = Table.
where(:id => id, :created_at => lower..upper).
sum(:my_column)
औसतन पहले संस्करण का उपयोग करने के तरीके को 300 एमएमएस निष्पादित करने के लिए लगता है (ऑपरेशन को इसके भीतर कुल दो हजार बार कहा जाता है), और दूसरे संस्करण का उपयोग करने वाली विधि लगभग 550ms लेती है। यह गति में लगभग 100% की कमी है।
मैंने दूसरे संस्करण द्वारा जेनरेट किए गए एसक्यूएल को दोबारा जांच लिया है, यह टेबल नाम के साथ तालिका तालिका को पूर्ववत करने के लिए अपवाद के साथ पहले जैसा है।
- धीमी गति क्यों? क्या ActiveRecord और SQL वास्तव में ऑपरेशन करने के बीच रूपांतरण लगभग 2x लेता है?
- अगर मुझे एक ही ऑपरेशन करने की ज़रूरत है तो मुझे सीधे एसक्यूएल (शायद यहां तक कि एक स्पोक) लिखने के लिए चिपकने की ज़रूरत है और मैं ओवरहेड को हिट नहीं करना चाहता हूं?
धन्यवाद!
सिर्फ .explain का उपयोग करें और क्वेरी उत्पन्न हुए उस को देखो, मैं वे दोनों समान, लागत रहे हैं यकीन है कि यह अलग दिखता है और thats क्यों यह इतना अब – antpaw
लेता है मैं दोबारा जांच क्वेरी योजनाओं हूँ, और सब। प्रतिस्थापित करना था। दूसरे संस्करण में .sum से चयन करें, क्योंकि आप उस से एक फिक्सम वापस प्राप्त करते हैं और मुझे उत्पन्न करने के लिए उपयोग की जाने वाली क्वेरी पर एक एक्सप्लैन करने का कोई तरीका नहीं मिल रहा है। –