2012-07-12 20 views
5

का अनुकूलन कैसे इस प्रकार मैं तीन संस्थाओं की है। मेरे पास वर्तमान में मेरे लिए दो विकल्प उपलब्ध हैं। मुझे नहीं पता कि कौन सा अनुकूलित है। विकल्प हैं:एक जेपीए क्वेरी

1. 
select c from EntityC c where c.entityb in (select b from EntityB b where b.entitya = :entitya) 

2. EntityB

private Set<EntityC> entityCCol; 

@OneToMany(mappedBy="entityb") 
public Set<EntityC> getEntityCCol() 
{ 
    return entityCCol; 
} 

select b from EntityB a join fetch a.entityCCol b 

इन दो प्रश्नों में से कौन सा आसान और अनुकूलित है के लिए एक नया संपत्ति जोड़ें

+1

क्या एंटीटीसी सी से सी का चयन करें जहां c.entityB.entityA =: a'? यदि आप यह क्वेरी बनाते हैं, और 'entityB (entityA, id) पर अनुक्रमणिका IX_B_A बनाते हैं, परिणामी क्वेरी पर्याप्त तेज़ी से होगी। –

उत्तर

3

यह संग्रह के आकार पर निर्भर करता है। छोटे संग्रह के लिए मैं ऑब्जेक्ट मॉडल में रिश्तों का उपयोग करूंगा। प्रदर्शन की तुलना में एक डिजाइन/उपयोगिता परिप्रेक्ष्य से अधिक, यह अधिक ऑब्जेक्ट उन्मुख है। हालांकि, मैं इसे सामान्य रूप से मॉडल तक पहुंचने में शामिल नहीं होता। अपने मॉडल को और अधिक उपयोगी बनाने के लिए आपको शायद ए से बी से संबंध होना चाहिए।

# 1 में क्वेरी के लिए, आपकी क्वेरी बहुत उप चयन का उपयोग कर कुशल नहीं है, बस एक में शामिल होने के EntityC ग से

चयन विकल्प का उपयोग, जहां c.entityb.entitya =: entitya

2

मुझे लगता है कि एसक्यूएल प्रश्नों में व्याख्या के साथ सभी प्रश्न हैं, ये केवल अलग शैलियों हैं, आपको इसके बारे में सोचना नहीं है। सभी प्रश्नों को थेटा शैली में व्याख्या किया जाएगा। मुझे नहीं लगता, एक प्रदर्शन अंतर है, यह केवल एक व्यक्तिगत पसंद है। यहां SQL क्वेरी शैली MySQL joins: ON vs. USING vs. Theta-style के बारे में एक बहुत ही नया आलेख है, मुझे आशा है कि यह लिंक आपको किसी भी तरह से मदद करेगा।

+0

उपरोक्त दो प्रश्नों और मेरी अन्य सुझाई गई क्वेरी पर मेरी चिंता प्रदर्शन है। मान लीजिए, डेटाबेस में एंटीटीबी के पास लगभग 20,000 रिकॉर्ड हैं और 20,000 रिकॉर्डों में से प्रत्येक में कम से कम 200 रिकॉर्ड हैं यानी EntityC। –