2009-11-23 18 views
9

मुझे हाल ही में एक अजीब घटना थी। एक गिनती प्राप्त करना था जिसमें विभिन्न WHERE स्थितियों के साथ एकाधिक तालिकाओं में शामिल होना शामिल था। मैंने पहले हाइबरनेट के मानदंड एपीआई के साथ क्वेरी लागू की। यह सही ढंग से अनुरोधित तैयार SQL कथन बनाया गया लेकिन धीमा था। एचक्यूएल का उपयोग कर पूरी क्वेरी फिर से लागू की। ऐसा करने के लिए बल्कि बुरा था, लेकिन परिणाम मानदंड एपीआई के मुकाबले बहुत तेजी से प्रदर्शन किया। क्या किसी को उस व्यवहार का कारण पता है? मुझे लगता है कि मानदंड और एचक्यूएल ढांचे को उसी कोड बेस का उपयोग एसक्यूएल में बदलने के लिए किया जाता है।हाइबरनेट क्वेरी बनाम मानदंड प्रदर्शन

select count(*) from R r where r.ISREPLACEDBY = 0 
and r.STATUS='OK' and r.A = ? 
and r.C in 
    (select distinct RC from CX cx where cx.FROMDATE >= ? and cx.FROMDATE <=?) 
+0

पढ़ सकते हैं आप HQL और मानदंड प्रश्नों दिखा सकते हैं? –

+0

क्वेरी पैरामीटर पर निर्भर करता है। सरल स्थिरीकरणों में से एक निम्न की तरह है: आर आर से गणना करें (*) जहां r.ISREPLACEDBY = 0 और r.STATUS = 'OK' और r.A =? और आरसी में (सीएक्स सीएक्स से अलग आरसी चुनें जहां cx.FROMDATE> =? और cx.FROMDATE <=?) – bertolami

उत्तर

17

मुझे लगता है कि मुझे अंत में कारण मिला। ऐसा लगता है कि मानदंड एपीआई प्रत्येक बार तैयार कथन निष्पादित होने पर नए चर नामों को बनाता है। डेटाबेस (हमारे मामले में, डीबी 2) प्रत्येक बार कथन निष्पादित होने पर एक नई क्वेरी निष्पादन योजना की गणना करता है। दूसरी तरफ, एचक्यूएल समान वैरिएबल नामों का उपयोग करता है, जिससे डेटाबेस क्वेरी निष्पादन योजनाओं का पुन: उपयोग करने की अनुमति देता है।

0

मैं आम तौर पर मानना ​​है कि HQL, बहुत इष्टतम के पास है, क्योंकि यह कुछ प्रतिस्थापन के साथ लगभग सीधे एसक्यूएल है:

क्वेरी है। मुझे लगता है कि एचक्यूएल से एसक्यूएल का अनुवाद सिर्फ प्रतिस्थापन है; मानदंड एपीआई शायद एचक्यूएल उत्पन्न करने के लिए उत्पन्न करता है। आम तौर पर एचक्यूएल आपकी सबसे अच्छी शर्त है।

+2

असल में, मानदंड सीधे एसक्यूएल में अनुवाद करता है। जैसे मानदंड .toSqlString – qualidafial

+0

यह वास्तव में सच नहीं है। यह पहले एचक्यूएल उत्पन्न करता है जिसे तब पार्स किया जाता है। – mnp

0

हाइबरनेट मानदंड, एसक्यूएल statments उत्पन्न करने के लिए

+0

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

3

मानदंड प्रतिबिंब का प्रयोग करें सिद्धांत में (नाम प्रश्नों, जो मैं करने के लिए मिल जाएगा के लिए छोड़कर) एक HQL क्वेरी से कम भूमि के ऊपर होना चाहिए। ऐसा इसलिए है क्योंकि मानदंड को कुछ भी विश्लेषण करने की आवश्यकता नहीं है। एचक्यूएल प्रश्नों को एक एएनटीएलआर-आधारित पार्सर के साथ पार्स किया जाता है और उसके परिणामस्वरूप एएसटी को एसक्यूएल में बदल दिया जाता है। हालांकि, एचक्यूएल/जेपीएक्यूएल के साथ आप नामित प्रश्नों को परिभाषित कर सकते हैं, जहां सत्र फैक्ट्री शुरू होने पर एसक्यूएल उत्पन्न होता है। सिद्धांत रूप में, नामित प्रश्नों में मानदंड से कम ओवरहेड होता है। तो, एसक्यूएल पीढ़ी खर्च के मायनों में हमने:

  1. नाम HQL/JPAQL क्वेरी - एसक्यूएल पीढ़ी केवल एक बार होता।
  2. मानदंड - उत्पन्न करने से पहले विश्लेषण करने की कोई आवश्यकता नहीं है।
  3. (गैर-नामित) एचक्यूएल/जेपीएक्यूएल क्वेरी - पार्स, फिर उत्पन्न करें। उस ने कहा, पार्सिंग और एसक्यूएल पीढ़ी के ऊपरी हिस्से के आधार पर एक क्वेरी तकनीक चुनना शायद मेरी राय में एक गलती है। असली डेटा वाले वास्तविक डेटाबेस सर्वर पर वास्तविक क्वेरी करने की तुलना में यह ओवरहेड आम तौर पर बहुत छोटा होता है। यदि ऐप प्रोफाइलिंग करते समय यह ओवरहेड वास्तव में दिखाई देता है तो शायद आपको एक नामांकित क्वेरी पर स्विच करना चाहिए।

यहाँ बातें मैं विचार जब मानदंड और HQL/JPAQL के बीच तय कर रहे हैं:

  • सबसे पहले, आप तय करने के लिए में हाइबरनेट मालिकाना एपीआई पर निर्भरता होने के साथ अगर आप ठीक कर रहे हैं अपने कोड। जेपीए में मानदंड नहीं है।
  • मानदंड कई वैकल्पिक खोज पैरामीटर को संभालने में वास्तव में अच्छा है जैसे कि आप एक बहु-पैरामीटर 'खोज फ़ॉर्म' के साथ एक सामान्य वेब पेज पर पा सकते हैं। एचक्यूएल के साथ, डेवलपर्स स्ट्रिंगबिल्डर के साथ धारा अभिव्यक्तियों पर ध्यान केंद्रित करते हैं (इससे बचें!)। मानदंड के साथ, आप ऐसा करने की आवश्यकता नहीं है।
  • एचक्यूएल/जेपीएक्यूएल का उपयोग अन्य चीजों के लिए किया जा सकता है, क्योंकि कोड को डेवलपर्स को समझने के लिए छोटे और आसान होने के लिए भेजता है।
  • यदि आप एचक्यूएल का उपयोग करते हैं तो वास्तव में अक्सर पूछे जाने वाले प्रश्नों को नामित प्रश्नों में बदल दिया जा सकता है। कुछ प्रोफाइलिंग के बाद, मैं इसे बाद में करना पसंद करता हूं।

आप कुछ अतिरिक्त जानकारी यहां http://tech.puredanger.com/2009/07/10/hibernate-query-cache/

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