2011-08-30 13 views
13

हाइबरनेट एन + 1 क्वेरी समस्या के आसपास होने के लिए (कम से कम) दो विकल्प प्रदान करता है। कोई FetchMode को उप-चयन में सेट कर रहा है, जो इन-क्लॉज के भीतर एक इन-क्लॉज और उप-चयन के साथ चयन उत्पन्न करता है। दूसरा बैचसाइज निर्दिष्ट करना है, जो माता-पिता की आईडी वाले एक इन-क्लॉज के साथ चयन उत्पन्न करता है।हाइबरनेट उप-चयन बनाम बैच लाने

दोनों काम लेकिन मैं उस सबसिलेक्ट विकल्प अक्सर माता-पिता जटिल होने के लिए क्वेरी की वजह से प्रदर्शन समस्याओं में चलाता है पाते हैं। दूसरी ओर, एक बड़े बैचसाइज (1000 कहें) के साथ, उन प्रश्नों की क्वेरी और जटिलता की संख्या बहुत छोटी है।

मेरा प्रश्न इस प्रकार है: जब आप BatchSize से अधिक हाइबरनेट के सबसिलेक्ट FetchMode का प्रयोग करेंगे? उप-चयन शायद समझ में आता है यदि आपके पास बहुत बड़ी संख्या में मूल प्रविष्टियां (हजारों) हैं, लेकिन क्या कोई अन्य परिदृश्य हैं जहां आप बैचसाइज के उप-चयन को प्राथमिकता देना चाहते हैं?

संपादित करें: उत्सुक लोडिंग से निपटने के दौरान मैंने दोनों के बीच एक अंतर देखा। यदि आपके पास xToMany एसोसिएशन सेट उत्सुकता से और उप-चयन के माध्यम से लोड किया गया है, तो यह उप-चयन उत्पन्न करता है जैसे कि यह आलसी था। यदि आप बैच आकार निर्दिष्ट करते हैं, तो जेनरेट की गई क्वेरी एक अलग क्वेरी के बजाय बाहरी जुड़ने का उपयोग करती है। उत्सुकता से लोड करते समय एक अलग बैच की गई क्वेरी का उपयोग करने के लिए हाइबरनेट को मजबूर करने का कोई तरीका है?

उत्तर

13

मैं उप-चयन का उपयोग नहीं करता, क्योंकि इसे नियंत्रित करना मुश्किल है। एक बहुत बड़ी प्रणाली में जिसमें जटिल व्यापार तर्क और उस पर काम करने वाली एक बड़ी टीम है, यह कहना मुश्किल है कि कौन से प्रश्नों का उपयोग किया जाता है। उप-चयन विशिष्ट मामलों में काम कर सकता है जहां आप वास्तव में जानते हैं कि कौन सी क्वेरी की जाती है।

बैच लाने में कुछ बड़े फायदे हैं। यह हमेशा सबसे तेज़ नहीं होता है, लेकिन आमतौर पर पर्याप्त तेज़ होता है। दूसरी ओर यह बहुत स्थिर है, इसका कोई दुष्प्रभाव नहीं है और व्यापार तर्क के लिए पूरी तरह से पारदर्शी है। मैं 100 से अधिक बैच मानों का कभी भी उपयोग नहीं करता हूं। एन + 1 को कुछ उचित मात्रा में प्रश्नों को कम करने के लिए पर्याप्त है।

+2

मुझे समझ में नहीं आता कि उप-चयन को नियंत्रित करना मुश्किल क्यों है। क्या आप कुछ प्रकाश डाल सकते हैं? –

+0

उप-चयन उस क्वेरी पर निर्भर करता है जो पहले निष्पादित किया गया था। यह क्वेरी बहुत जटिल हो सकती है, उदा। गैर-अनुक्रमित कॉलम द्वारा कई अन्य टेबल और फ़िल्टरिंग का उपयोग करना। इसलिए यह कहना मुश्किल है कि उपक्वायर दृष्टिकोण प्रदर्शन को बढ़ाने की संभावना है। –

+1

उप-चयन के साथ एक और समस्या MySQL के साथ फसल हो सकती है; MySQL (5.5 और नीचे) नेस्टेड प्रश्नों के साथ भयानक प्रदर्शन है, क्योंकि यह जबरन उन्हें सहसंबंधित करता है, और मूल क्वेरी में प्रत्येक पंक्ति के लिए उन्हें पुनर्मूल्यांकन करता है। मुझे एनबर्नेट के लिए एनोटेटेड रिलेशनशिप के लिए नेस्टेड क्वेरी उत्पन्न करने का कोई अन्य तरीका नहीं मिल रहा है, इसलिए उप-चयन से बचने से MySQL के साथ एक बुरा आश्चर्य हो जाएगा। –

2

मैं this article पाया सहायक हो। मेरा मानना ​​है कि बैच-फ़ेचिंग को संग्रह और अभिभावक दोनों पर लागू किया जा सकता है, जबकि उप-चयन केवल संग्रह पर ही लागू किया जा सकता है।

संग्रह के लिए एक fetching रणनीति के मामले में, एक उप-चयन एक बार निष्पादित किया जाएगा (क्योंकि बैच आकार प्रभावी रूप से अनंत है), जबकि SQL कथन को बैच-फ़ेचिंग के साथ कई बार निष्पादित किया जा सकता है।

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