2009-03-05 17 views
43

अधिकांश हाइबरनेट संघों का समर्थन "को लाने" पैरामीटर:हाइबरनेट फ़ेचिंग रणनीति - "शामिल" का उपयोग कब करें और "चयन करें" का उपयोग कब करें?

fetch="join|select" 
"का चयन करें" डिफ़ॉल्ट मान होने के साथ

यह तय करने के लिए कि किस संगठन के लिए उपयोग करना है?

मैंने सभी को "चयन" से "जुड़ने" एप्लिकेशन में बदलने की कोशिश की - जेनरेट किए गए प्रश्नों की संख्या शायद 10 गुना कम हो गई लेकिन प्रदर्शन बिल्कुल वही रहा (यहां तक ​​कि थोड़ा सा भी बदतर हो गया)।

धन्यवाद।

+0

अन्य मामले में एक ही चयन कथन में सभी जानकारी को पुनः प्राप्त करने के लिए शामिल हों, जबकि यदि आप fetching = "चयन करें" हाइबरनेट संबंधित संग्रह लाने के लिए दूसरा चयन कथन पास करेगा, जब तक आप आलसी = "झूठी निर्दिष्ट करके आलसी fetching अक्षम नहीं करते "आप यहां अधिक जानकारी प्राप्त कर सकते हैं http://javawebtutorial.blogspot.in/2013/09/hibernate-fetching-strategies.html – user528050

उत्तर

38

एन + 1 समस्या को हल करने के लिए शामिल होना चाहिए। यदि आपके पास 10 माता-पिता हैं, तो प्रत्येक 10 बच्चों के साथ, एक प्रश्न की आवश्यकता होगी और चयन के लिए 11 (माता-पिता के लिए एक और प्रत्येक माता-पिता के बच्चों के लिए) की आवश्यकता होगी। यदि डेटाबेस एप्लिकेशन के समान सर्वर पर है या नेटवर्क वास्तव में तेज़ है, तो यह एक बड़ा सौदा नहीं हो सकता है, लेकिन यदि प्रत्येक डेटाबेस कॉल में विलंबता है, तो यह जोड़ सकता है। प्रारंभिक क्वेरी पर जॉइन विधि थोड़ा कम कुशल है क्योंकि आप प्रत्येक पंक्ति में पैरेंट कॉलम डुप्लिकेट कर रहे हैं, लेकिन आप केवल डेटाबेस में एक राउंड-ट्रिप बनाते हैं।

आम तौर पर, अगर मुझे पता है कि मुझे सभी माता-पिता के बच्चों की आवश्यकता होगी, तो मैं शामिल होने के साथ जाऊंगा। अगर मुझे केवल कुछ माता-पिता के बच्चों की आवश्यकता होगी, तो मैं चयन का उपयोग करता हूं।

+7

एचएम, मैंने इसे उत्पादन पर आजमाया (हमारे पास गुलामों के साथ रिमोट डीबी सर्वर है) और व्यवहार बिल्कुल ठीक रहा वही - "चयन" से थोड़ा छोटा बुरा। एन + 1 समस्या के साथ मदद करने के लिए हम "default_batch_fetch_size" का उपयोग कर रहे हैं, इसलिए यह बैच में चुनिंदा प्रश्न चलाएगा, एक-एक करके नहीं। – serg

9

चयन उनके लिए डेटाबेस में एक नई क्वेरी जारी करके बाल आइटम लाएगा। जुड़ें बच्चे की वस्तुओं को माता-पिता की क्वेरी में शामिल करके लाएंगे। इसलिए यही कारण है कि आप प्रश्नों की संख्या में गिरावट के साथ भी समान प्रदर्शन देख रहे हैं।

चुनें:

SELECT * FROM parent WHERE id=(whatever) 
SELECT * FROM child WHERE id=(parent.child.id) 

में शामिल हों:

SELECT * 
FROM parent 
LEFT OUTER JOIN child ON parent.child.id=child.id 
WHERE parent.id=(whatever) 

जब अन्य ... पूरे सुनिश्चित नहीं हैं कि ऊपर एक का उपयोग करने के लिए के रूप में। यह संभवतः डेटाबेस सिस्टम पर निर्भर करता है। अगर कोई दूसरे से हमेशा बेहतर होता, तो मुझे संदेह है कि वे आपको विकल्प देने के लिए परेशान होंगे! यदि आप प्रत्येक के लिए समान प्रदर्शन देख रहे हैं, तो मैं इसके बारे में चिंता नहीं करता।

1

fetching = "शामिल हों" यदि आप = "शामिल" करते हैं तो यह एक ही चयन कथन में सभी जानकारी को पुनः प्राप्त करेगा। यदि आप दूसरे का चयन बयान पास करने के लिए उस मामले में से जुड़े संग्रह लाने के लिए आप लाने = का उपयोग करें "का चयन करें" होगा चाहते

प्राप्त कर रहा है = "का चयन करें"।

स्रोत: Hibernate Fetching Strategies

0

लोग हमेशा लाने = शामिल हों का उपयोग कर प्रदर्शन हिट के बारे में बात कर रहे हैं। लेकिन जैसा कि मैंने माना है, हमारे लिए महत्वपूर्ण माता-पिता/बाल अभिलेखों की संख्या को समझना महत्वपूर्ण है:

यदि आप केवल एक ही अभिभावक रिकॉर्ड प्राप्त करना चाहते हैं और उम्मीद है कि इसमें कई बच्चे नहीं हैं, तो मैं सुझाव दूंगा आप fetch = SELECT का उपयोग करने के लिए।

आप अपने बच्चों सहित सभी माता पिता रिकॉर्ड लाने के लिए चाहते हैं, तो यह बेहतर होगा लिए लाने का जाना =

बस एक नोट जोड़ने के लिए शामिल हों कि, रिकॉर्ड lazily बच्चों फ़ेच कर रहे हैं अगर (आलसी = सच), तो fetch = JOIN का उपयोग करने का कोई अर्थ नहीं होगा क्योंकि सभी माता-पिता और बाल रिकॉर्ड एक शॉट में लोड हो जाते हैं।

0

यदि माता-पिता के बहुत सारे बच्चे हैं और बदले में उन बच्चों के पास कई अन्य हैं, तो इस मामले में प्रारंभिक 'जॉइन' नेटवर्क को दबा सकता है। मेरा सुझाव है कि चयन को विभाजित करने के लिए इस मामले में 'चयन' का उपयोग करना है।

0

जॉइन को आम तौर पर प्रदर्शन कारणों से प्राथमिकता दी जाती है।

SELECT का उपयोग करने का एक कारण यह है कि यदि आप पेजिंग परिणाम (ऑफ़सेट और सीमा निर्धारित करते हैं) जिनमें कई से अधिक रिश्ते हैं। यदि आप जॉइन का उपयोग करते हैं, तो रूट इकाई कई बार दिखाई देगी यदि इसमें कई से अधिक बच्चे हैं और आपकी सीमा के विरुद्ध "प्रतियां" गिनती हैं (भले ही हाइबरनेट DISTINCT_ROOT_ENTITY का उपयोग करके तथ्य के बाद उन्हें ध्वस्त कर दे)।

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