2012-05-13 12 views
5

में यूनियन-सबक्लास के जेनरेट किए गए SQL के कारण होने वाले प्रदर्शन समस्याओं को कैसे दूर करें I TABLE_PER_CLASS विरासत रणनीति के लिए हाइबरनेट समर्थन का उपयोग कर रहा हूं। कार्यक्षमता के अनुसार यह अच्छी तरह से काम करता है। जब भी बहुरूपी क्वेरी जारी किया जाता है हाइबरनेट मेरे दो ठोस वर्ग के लिए युक्त "संघ सभी" एक एसक्यूएल उत्पन्न करता है एक & बी उत्पन्न एसक्यूएल निम्न स्वरूप है:हाइबरनेट

select C1, C2, C3 from (
    select C1, C2, C3 from ClassA 
    union all 
    select C1, C2, C3 from ClassB 
) 
where 
    C1 == <value> 
order by C2 
limit 100 

समस्या इस दृष्टिकोण डीबी पर वास्तव में खराब प्रदर्शन से ग्रस्त है पक्ष। सी 1 कॉलम को ध्यान में रखते हुए क्लासए और क्लासबी (अमूर्त माता-पिता से व्युत्पन्न) की एक साझा संपत्ति है, हाइबरनेट दोनों उप चयनों में जहां खंड और नाटकीय रूप से प्रदर्शन में सुधार कर सकता है। उदाहरण के लिए,

select C1, C2, C3 from ( 
    select C1, C2, C3 from ClassA where C1 == <value> 
    union all 
    select C1, C2, C3 from ClassB where C1 == <value> 
) 
order by C2 
limit 100 

कुछ अनुकूलन सीमा पर भी किया जा सकता है। मैं अपने डीएओ परत में हाइबरनेट मानदंड API का उपयोग कर रहा हूं।

इंटरसेप्टर, onPrepareStatment() का उपयोग नहीं किया जा सकता क्योंकि तर्क दिखाई नहीं दे रहे हैं। डीबी पर विभाजन और संभावित रूप से अन्य विकल्पों का उपयोग वर्तमान में दायरे से बाहर है क्योंकि हम काम के इस चरण में डीबी विशिष्ट अनुकूलन से बचना चाहते हैं।

कोई विचार प्रदर्शन को बेहतर बनाने के लिए हाइबरनेट में हेरफेर कैसे करें?

+0

क्या आप अधिक स्पष्ट हो सकते हैं - अब उत्पन्न SQL क्वेरी और वेरिएंट दें जिससे बेहतर प्रदर्शन होगा। – gkamal

+0

अंतर्निहित डेटाबेस क्या है? मुझे लगता है कि यह ओरेकल नहीं होगा, क्योंकि यह आम तौर पर उप-चयनों और यूनियनों में भविष्यवाणी करता है ... क्या सी 1' दोनों टेबलों में उचित सूचकांक है? –

+0

सी 1 दोनों टेबलों पर एक सूचकांक है। हम उनमें से कई डीबी का समर्थन कर सकते हैं, उनमें से डर्बी (शुद्ध जावा)। नतीजतन वर्तमान फोकस एक स्कीमा को परिभाषित करना है जो सभी डेटाबेस के लिए सर्वश्रेष्ठ प्रदर्शन प्रदान करेगा। – user1392212

उत्तर

0

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

ध्यान दें कि यदि आप अपने वर्ग की श्रेणी में दो से अधिक स्तर हैं तो आप भेदभावकर्ता-कॉलम के साथ टेबल-पीआर-क्लास को जोड़ सकते हैं।

+0

उत्तर के लिए धन्यवाद। फिर भी, मैं विशाल तालिका से बचने की कोशिश कर रहा हूं, जिसमें टेबलों को विभाजित करके 99% समय के डेटा की आवश्यकता नहीं है। – user1392212