2011-11-23 14 views
6

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

मैं एसक्यूएल कथन को हाइबरनेट करना चाहता हूं जिसमें बाध्य चर के बजाय विभाजन कुंजी कॉलम के लिए एक शाब्दिक मान शामिल है। इसे पाठ्यक्रम के किसी अन्य मूल्य के लिए बाध्य चर का उपयोग करना चाहिए।

विभाजन कुंजी के लिए एक शाब्दिक का उपयोग करने से ओरेकल ज्ञात विभाजन और एकत्रित आंकड़ों के लिए विशिष्ट योजना के साथ आने की अनुमति देगा। यह कॉलम के लिए भी उपयोगी हो सकता है जिसमें स्क्व्यूड डेटा के लिए हिस्टोग्राम होता है।

यह इकाई में निर्दिष्ट करना बेहतर होगा अन्यथा हमें प्रत्येक क्वेरी में इसे करने की आवश्यकता होगी। क्या हाइबरनेट में ऐसा करने का कोई तरीका है?

हम ओरेकल 10 जी डायलेक्ट का उपयोग करके 3.6.1 हाइबरनेट पर हैं।

यदि हाइबरनेट में इसे मूल रूप से करने का कोई तरीका नहीं है, तो क्या मैं ऐसा करने के लिए उपयोगकर्ता प्रकार या बोली या कुछ बना सकता हूं?

+1

अनुकूली कर्सर बंटवारे आपकी समस्याओं का समाधान 11g चाहेंगे? –

+0

@ जेनियरल्स हां शायद 11 जी अनुकूली कर्सर साझाकरण और/या कार्डिनालिटी फीडबैक के माध्यम से इन समस्याओं को हल करेगा। हम उत्पादन के लिए 11 जी तक पहुंचने की दिशा में काम कर रहे हैं लेकिन वहां काफी परीक्षण किए जा रहे हैं। –

+0

स्पष्ट होने के लिए, क्या आप कह रहे हैं कि विभाजन छंटनी स्वयं बाध्य चर के साथ काम करती है, लेकिन विभाजन के भीतर क्वेरी योजना (उदाहरण के लिए, रणनीति में शामिल हों) नहीं है? – wrschneider

उत्तर

1

नहीं, हिब्रनेट में शाब्दिक मान समर्थित नहीं हैं। मुझे संदेह है कि क्या आप एक कामकाज कर सकते हैं लेकिन मुझे लगता है कि आप एक और समाधान की तलाश में हैं।

+2

यदि हाइबरनेट में ऐसा करने का बिल्कुल कोई तरीका नहीं है तो हम हाइबरनेट का उपयोग नहीं करेंगे। –

0

एक कामकाज के रूप में, आप प्रत्येक "रोचक" कॉल साइट पर एक अनूठी टिप्पणी सेट कर सकते हैं, ताकि आप ओरेकल के बाध्य चरम peeking को नियंत्रित कर सकें।

... 
query = session.createQuery("..."); 
... 
query.setString("param1", "FOO"); 
query.setInteger("param2", param2Value); 
... 
query.setComment("param1 = \"FOO\""); 
... 

इस तरह, अनुकूलक कठिन पार्स समय में "FOO" (हमेशा की तरह) देखेंगे। भविष्य के आविष्कारों में, ओरेकल निष्पादन योजना का पुन: उपयोग करने के लिए एसक्यूएल की एक सटीक प्रति खोज करेगा। चूंकि टिप्पणी क्वेरी को प्रभावी ढंग से अनूठी बनाती है, यह आपको वही निष्पादन योजना प्रदान करेगी जिसकी गणना "FOO" के साथ की गई थी, और param1 का कोई अन्य मूल्य नहीं था।

आपको सावधान रहना चाहिए क्योंकि अनुकूलक निष्पादन योजना की गणना करने के लिए param2Value के मान का भी उपयोग करेगा, इसलिए यह हस्तक्षेप कर सकता है। लेकिन मुझे लगता है कि कम से कम यह एक कोशिश के लायक है।

+1

हमने योजना अस्थिरता के कारण बाध्य परिवर्तनीय झुकाव को अक्षम कर दिया है।एक उदाहरण एक रात का बैच नौकरी था - जो भी ग्राहक का उदाहरण पहले भाग गया था, उसके बाद योजना के लिए योजना निर्धारित की गई थी। यह हमेशा अच्छा नहीं था। –

+0

वैसे यह इस कामकाज का पूरा बिंदु है: अलग-अलग योजनाओं का उपयोग करने वाले प्रश्नों को टेक्स्ट अलग-अलग एसक्यूएल मिलते हैं, इसलिए आपको पिकिंग को अक्षम करने और इसके फायदे खोने की ज़रूरत नहीं है। लेकिन ठीक है, आप इसके लिए इसे पुन: सक्षम नहीं करेंगे। – gpeche

+0

क्या आपने उन प्रश्नों के लिए एसक्यूएल प्रोफाइल का उपयोग करने के बारे में सोचा है जो शाब्दिक से लाभान्वित होंगे? – gpeche

1

आप नामित NQueryQuery का उपयोग कर सकते हैं यहां नमूना कार्यान्वयन है।

इकाई वर्ग

@Entity 
@Table(catalog = DBCatalog) 
@org.hibernate.annotations.NamedNativeQuery(name="partitionTR1",query ="SELECT * FROM DATAMARTTRANSACTIONHISTORY PARTITION (tr1) where id=?",resultClass=DataMartTable.class) 
public class DataMartTransactionHistory implements TransactionHistory { 
    @Id 
    @Column 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Enumerated(EnumType.ORDINAL) 
    private TransactionStatus transactionStatus; 
... other props... 
} 

है और यहाँ एक दाव कार्यान्वयन है।

public DataMartTransactionHistory findDataMartTransactionHistoryTR1(Long id) { 
    Query namedQuery = getSessionFactory().getCurrentSession().getNamedQuery("partitionTR1"); 
    namedQuery.setLong(0, id); 
    return (DataMartTransactionHistory)namedQuery.list().get(0); 
} 
+0

जिस तरह से मेरी तालिका का पालन किया जाता है। टेबल DATAMARTTRANSACTIONHISTORY बनाएँ ( आईडी नंबर (19) नहीं NULL, .... TRANSACTIONSTATUS संख्या (10) ) सूची से विभाजन (TRANSACTIONSTATUS) (विभाजन tr1 मूल्यों (1), विभाजन TR2 मूल्यों (2)) – dursun

+0

आपकी नामित क्वेरी में आपके पास "id id =?" है। क्या आप कह रहे हैं कि इसे बाध्य चर के बजाय एक शाब्दिक मूल्य के साथ बदल दिया जाएगा? –

+0

नहीं यह एक बाध्य चर है मैंने "भाग (tr1)" को शाब्दिक के रूप में जोड़ा है। आप यहां और जोड़ सकते हैं। यदि आप मुझे एक विशिष्ट उपयोगकाज देते हैं, तो मैं आपको एक विशिष्ट उदाहरण उत्पन्न कर सकता हूं। – dursun

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

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