2010-06-03 4 views
9

मैं PostgreSQLDialect का उपयोग करके PostgreSQL 8.4 के साथ एक काफी बड़ी परियोजना में हाइबरनेट 3.3.2 का उपयोग कर रहा हूं।विदेशी कुंजी पर इंडेक्स उत्पन्न करने के लिए हाइबरनेट प्राप्त करना

जिस तरह से हमारे रिश्तों की स्थापना हुई है, हम अपने टेबल के विदेशी प्रमुख विशेषताओं पर बहुत सारी खोज कर रहे हैं।

प्रदर्शन कारणों से, मैं Hibm2dll.auto का उपयोग करके हमारी टेबल बना रहे हैं, तो मैं सभी विदेशी कुंजी कॉलम में इंडेक्स जोड़ना चाहता हूं।

MySQL स्वचालित रूप से इन कॉलम में इंडेक्स जोड़ देगा, लेकिन पोस्टग्रेज़ में ऐसा करने का कोई तरीका नहीं प्रतीत होता है।

क्या ऐसा कोई विकल्प है जिसे मैं कहीं भी सेट कर सकता हूं, या कुछ ऐसा करने के लिए जो मैं अपने hbm.xml फ़ाइलों में जोड़ सकता हूं?

उत्तर

2

हाइबरनेट केवल MySQL के लिए इंडेक्सक्रिकेशन लागू करता है, पोस्टग्रेएसक्यूएल, ओरेकल, आदि के लिए नहीं। MySQL इंडेक्स के बिना विदेशी कुंजी की अनुमति नहीं देता है, अन्य डेटाबेस में यह प्रतिबंध नहीं है।

साइबेस के पास explanation है, यह सूचकांक को लागू न करने की अच्छी बात क्यों है, Hibernate forum में इसके बारे में एक विषय भी है (ओरेकल संबंधित) जिसमें वर्कअराउंड शामिल है। लेकिन इससे पहले कि आप बहुत सारे इंडेक्स बनाना शुरू करें, जांच करें कि आपको इन सभी इंडेक्स की आवश्यकता है या नहीं। कई मामलों में इंडेक्स को चीजों को गति देने के लिए दूसरों के साथ जोड़ा जा सकता है। यह सब निर्भर करता है!

उपयोग आपके चयन पर व्याख्या को देखने के लिए कैसे डेटाबेस उन्हें कार्यान्वित करता है, क्या अनुक्रमित उपयोग किया जाता है, जहां अनुक्रमित याद कर रहे हैं, आदि

+4

यह अच्छी समझ में आता है कि * बल * विदेशी कुंजी को इंडेक्स रखने के लिए नहीं, लेकिन ऐसा लगता है कि यह अच्छा होगा अनुमति देने के लिए विकल्प। – biggusjimmus

1

दोनों में से किसी का प्रयास करें:

<many-to-one name="master" class="Master" column="master_id" index="my_index_name" /> 

<many-to-one name="master" class="Master"> 
    <column name="master_id" index="my_index_name" /> 
</many-to-one> 
+0

मैंने इन दोनों की कोशिश की, लेकिन इंडेक्स के लिए डेटाबेस खोजना जो उत्पन्न होना चाहिए था कोई परिणाम = \ सुनिश्चित नहीं है कि मैं गलत क्या कर रहा हूं, लेकिन इसमें प्लगिंग रखेगा। – biggusjimmus

+0

क्या सेटिंग है आप इसका उपयोग कर रहे हैं? हो सकता है कि उन्हें "अपडेट" के साथ जोड़ा नहीं गया हो, लेकिन "बनाना" या "create-drop" के साथ होगा? एक और विचार, क्या यह इस तरह की एक बग हो सकता है: http: //opensource.atlassian। कॉम/प्रोजेक्ट/हाइबरनेट/ब्राउज/एचएचएच-1012 –

2

यहाँ एक है जल्दी-और- गंदा क्वेरी है कि एक स्कीमा में प्रत्येक परिभाषित विदेशी कुंजी सूचक के लिए DDL उत्पन्न होगा:

SELECT 'CREATE INDEX fk_' || conname || '_idx ON ' 
     || relname || ' ' || 
     regexp_replace(
      regexp_replace(pg_get_constraintdef(pg_constraint.oid, true), 
      ' REFERENCES.*$','',''), 'FOREIGN KEY ','','') || ';' 
FROM pg_constraint 
JOIN pg_class 
    ON (conrelid = pg_class.oid) 
JOIN pg_namespace 
    ON (relnamespace = pg_namespace.oid) 
WHERE contype = 'f' 
    AND nspname = 'public'; 

यह केवल PostgreSQL 8.4 में परीक्षण किया गया है, लेकिन मुझे लगता है कि यह सबसे 8.x vers में काम करना चाहिए आयनों।

यह भी ध्यान रखें कि यह पता नहीं लगाता कि कौन से पहले से ही एक इंडेक्स द्वारा कवर किए गए हैं, इसलिए आपके पास शायद कुछ डुप्लिकेशंस होगा।

+0

डेटाबेस स्थापित होने के बाद, यह सहायक है, लेकिन इस सवाल के लिए, मैं वास्तव में प्राप्त करने में अधिक रुचि रखता था जब यह टेबल बनाता है, तो मेरे लिए यह करने के लिए हाइबरनेट करें। यह मेरे दूसरे, संबंधित प्रश्न के लिए एक अच्छा जवाब है हालांकि: http: // stackoverflow।कॉम/प्रश्न/2 9 70050/पोस्टग्रेस्क्ल-कैसे-से-इंडेक्स-सभी-विदेशी-कुंजी – biggusjimmus

+0

मुझे लगता है, यह उद्धृत नाम चर पर काम नहीं करता है। –

+0

@Ravshan: इस समय के लिए अनदेखा करना कि किसी को डेटाबेस तालिका परिभाषाओं में उद्धृत नामों का उपयोग नहीं करना चाहिए, यह 9.3 में मेरे लिए काम करता है: अलग regexp_replace (regexp_replace (pg_get_constraintdef (oid), '^। * संदर्भ', 'CREATE चुनें इंडेक्स ऑन '),' \)। * $ ','); ') Pg_constraint से जहां contype =' f '। –

-1

मैथ्यू के जवाब के अलावा: जोड़ना

AND NOT EXISTS (
    SELECT * FROM pg_class pgc 
    JOIN pg_namespace pgn ON (pgc.relnamespace = pgn.oid) 
    WHERE relkind='i' 
    AND pgc.relname = ('fk_' || conname || '_idx')) 

ठीक पहले अर्धविराम केवल अनुक्रमणिका बनाता है यदि वे मौजूद नहीं है। यह आपको "संबंध fk _..." उत्पादन के बिना बार-बार कथन निष्पादित करने की अनुमति देता है "त्रुटियां।

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