2012-04-10 17 views
27

मैं उत्सुक लोडिंग और आलसी लोडिंग के बारे में उलझन में हूं, क्या रेल प्रश्नों के प्रदर्शन में कोई अंतर है?रेल में उत्सुक लोडिंग और आलसी लोडिंग

वहाँ दोनों तरीकों से लागू करने के लिए कोई तरीका है? प्रदर्शन में सुधार करने

उत्तर

41

Eager Loading

एक तरह से एसक्यूएल क्वेरी की संख्या में कटौती करने के लिए है। आप उत्सुक लोडिंग के माध्यम से ऐसा कर सकते हैं।

1) सभी उपयोगकर्ताओं के लिए एक:

User.find(:all, :include => :friends) 

यहाँ आप केवल दो प्रश्नों फायरिंग कर रहे हैं।

2) उपयोगकर्ताओं के सभी दोस्तों के लिए एक।

Lazy Loading:

जब आप किसी उपयोगकर्ता की तरह कई वस्तुओं के साथ जुड़े एक वस्तु कई दोस्त है और आप एक सूची ऑर्कुट में के रूप में आप के रूप में कई प्रश्नों आग के रूप में वहाँ दोस्त हैं, के साथ साथ वस्तु के लिए एक प्रदर्शित करना चाहते हैं अपने आप।

users.each do |user| 
    friend = Friend.find_by_user_id(user.id) 
end 

यहाँ

1) सभी उपयोगकर्ताओं के लिए एक क्वेरी:

users = User.find(:all) 

तब की तरह प्रत्येक उपयोगकर्ता दोस्त के लिए क्वेरी,। एन के लिए

2) एन क्वेरी नहीं। उपयोगकर्ताओं के दोस्तों के। आप इस समझने में मदद मिलेगी कि Rails 3: Lazy loading versus eager loading

आशा:

पर एक नजर डालें।

+8

चेक इस रूप में अच्छी तरह: http://www.spritle.com/ ब्लॉग/2011/03/17/उत्सुक लोडिंग और आलसी लोडिंग-इन-रेल-ActiveRecord/ – Vik

+2

विक अच्छे और साफ स्पष्टीकरण .. –

+3

लेज़ी लोड हो रहा है नहीं उत्सुक लोड हो रहा है का उपयोग नहीं के समान है। '" लेज़ी लोड हो रहा है सामान्यतः बिंदु है जिस पर यह आवश्यक है जब तक एक वस्तु का आरंभीकरण स्थगित करने कंप्यूटर प्रोग्रामिंग में इस्तेमाल एक डिजाइन पैटर्न है। अगर ठीक से और उचित रूप से इस्तेमाल किया यह कार्यक्रम के संचालन में दक्षता के लिए योगदान कर सकते हैं। " -Wikipedia' मूल रूप से अपने पृष्ठ छवियों है कि एक उपयोगकर्ता जब तक वह स्क्रॉल नहीं देखता का एक समूह है, तो आप जब तक वह नीचे स्क्रॉल इंतजार कर सकते हैं और यह लोड करने के लिए छवि देखेंगे। वह आलसी लोडिंग है। –

5

उत्सुक लोड हो रहा है

(Vicksburg में) की तरह अपनी बंदूकें लोड करता है और बस तक आप वास्तव में इसका इस्तेमाल करने की जरूरत है प्रतीक्षा करें। यह उत्सुक लोडिंग की नीति है।

प्रो: यह सब कुछ जाने के लिए तैयार है।

कॉन: आप स्पेस/मेमोरी का उपयोग कर रहे हैं।

लेज़ी लोड हो रहा है

एक जवान नौसेना कैडेट लॉर्ड नेल्सन पूछा क्यों वह अपने जहाजों की तैयारी नहीं कर रहा था:

"मैं अपने बंदूकों जल्दी लोड नहीं होगा ....... मैं इससे पहले कि मुझे इसे आग लगाना पड़े, केवल 1 माइक्रोसॉन्ड लोड होगा। " उसने कहा। यह एक आलसी लोडिंग नीति है।

आलसी लोडिंग का प्रो: जब तक आपको आवश्यकता नहीं है तब तक डेटाबेस को हिट नहीं करते हैं।

कॉन: आप डेटाबेस एन + 1 बार मार रहे होंगे ..... जब तक कि आप बिल्कुल इच्छित कॉलम का चयन न करें और आप इसे उपनाम दें। जैसे

@products = Product.order("categories.name").joins(:category) 

एक आलसी लोड हो रहा है नीति के साथ केवल एक बार डाटाबेस साधते:

ऊपर क्वेरी डेटाबेस एन 1 बार हिट जब आप दृश्य टेम्पलेट में product.category.name कहते हैं - जहां उत्पाद है @products संबंध के भीतर एक ही वस्तु। लेकिन अगर आप यह उपनाम, तुम सब कुछ सिर्फ एक क्वेरी के साथ कार्य पूर्ण कर सकें:

@products = Product.order("categories.name").joins(:category).select("products.*, categories.name as category_name") 

और इस तरह इसका इस्तेमाल: product.category_name

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