क्या मुझे ओरेकल पर विदेशी कुंजी पर अनुक्रमित बनाने की आवश्यकता है?


120

मेरे पास एक टेबल Aऔर एक टेबल है BAकी प्राथमिक कुंजी Bपर एक विदेशी कुंजी है ।BB_ID

किसी कारण से (मुझे पता है कि वैध कारण हैं) यह कुंजी का उपयोग नहीं कर रहा है जब मैं कुंजी पर इन दो तालिकाओं में शामिल होता हूं।

क्या मुझे अलग से एक इंडेक्स बनाने की आवश्यकता है A.B_IDया विदेशी कुंजी का अस्तित्व प्रदान करना चाहिए?

जवाबों:


136

केवल विदेशी कुंजी बाधा ओरेकल पर सूचकांक प्रदान नहीं करता है - एक (और चाहिए) बनाया जाना चाहिए।


11
एक विदेशी कुंजी बाधा बनाने वाले कुछ डेटाबेस पर, एक इंडेक्स भी बनाता है ... यानी जेट इंजन (MSAccess फाइलें, Firebird और MySQL)
bubi

17
यह उत्तर किसी विशेष डेटाबेस कार्यान्वयन के स्पष्ट उल्लेख के बिना अर्थहीन है। सुनिश्चित करें कि प्रश्न टैग किया गया है oracleलेकिन जब आप Google खोज से यहां आते हैं तो यह तुरंत स्पष्ट नहीं होता है।
डेवलेपर

5
मैं इस बात की पुष्टि कर सकता हूं कि पोस्टग्रेक्सेल - कम से कम इस पोस्ट के समय - यह स्वचालित रूप से नहीं करता है।
देंबिंस्की

SQL सर्वर (2016, Azure ...) के लिए समान उत्तर, जहाँ तक मुझे पता है।
Pac0

ओरेकल के साथ एक विदेशी कुंजी पर एक इंडेक्स क्यों बनाना चाहिए? कृपया ऐसा नहीं करने के परिणाम क्या हैं?
Đỗ Công Bằng

46

एक विदेशी कुंजी बनाना स्वचालित रूप से A.B_ID पर एक इंडेक्स नहीं बनाता है। इसलिए यह आम तौर पर A.B_ID पर एक अलग सूचकांक बनाने के लिए क्वेरी प्रदर्शन के दृष्टिकोण से समझ में आता है।

यदि आप कभी B में पंक्तियों को हटाते हैं, तो आप निश्चित रूप से A.B_ID को अनुक्रमित करना चाहते हैं। अन्यथा, ओरेकल को हर बार जब आप बी से एक पंक्ति हटाते हैं, तो यह सुनिश्चित करने के लिए कि आपको कोई अनाथ रिकॉर्ड नहीं है (ओरेकल संस्करण पर निर्भर करता है, अतिरिक्त लॉकिंग निहितार्थ भी हो सकते हैं, पर एक पूर्ण टेबल स्कैन करना होगा, लेकिन वे कम हो गए हैं अधिक हाल के Oracle संस्करणों में)।


1
PFK कॉलम के बारे में क्या? उदाहरण के लिए यदि मेरे पास कई-से-कई संबंधों के लिए एक मध्यवर्ती तालिका है, तो शोलुद मैं इस तालिका के दो पीएफके कॉलम के लिए एक सूचकांक बनाता हूं?
क्लेमारी

3
@ क्लैमारी - यदि C के पास (A_ID, B_ID) की प्राथमिक कुंजी है, तो प्राथमिक कुंजी A से हटाने में सक्षम होगी। यदि आप भी B से कुशलतापूर्वक हटाना चाहते हैं, तो आप एक सूचकांक चाहते हैं B_ID
जस्टिन गुफा

25

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

हालांकि, अधिकांश समय, आप एक इंडेक्स बनाना चाहेंगे (वास्तव में, ओरेकल एपेक्स में "अनइंडैक्सड फॉरेन कीज" की रिपोर्ट है)।

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

एक ऐसा मामला जहां मैं आमतौर पर एक सूचकांक जोड़ने के लिए नहीं चुनता हूं , जहां एफके एक "स्थिर डेटा" तालिका है जो स्तंभ के डोमेन को परिभाषित करता है (जैसे स्थिति कोड की एक तालिका), जहां माता-पिता की मेज पर अपडेट और डिलीट कभी नहीं किए जाते हैं सीधे आवेदन द्वारा। हालांकि, यदि स्तंभ पर एक इंडेक्स जोड़ने से आवेदन में महत्वपूर्ण प्रश्नों का लाभ मिलता है, तो सूचकांक अभी भी एक अच्छा विचार होगा।


14

SQL सर्वर ने कभी भी विदेशी कुंजी कॉलमों पर स्वचालित रूप से इंडेक्स नहीं डाला है - इस शहरी मिथक की पृष्ठभूमि और इतिहास पर किम ट्रिप के उत्कृष्ट ब्लॉग पोस्ट की जांच करें ।

यह आमतौर पर आपके विदेशी कुंजी कॉलम को इंडेक्स करने के लिए एक अच्छा विचार है, लेकिन - हां, मैं यह सुनिश्चित करने की सिफारिश करूंगा कि प्रत्येक एफके कॉलम एक इंडेक्स द्वारा समर्थित है; जरूरी नहीं कि अकेले उस एक कॉलम पर - हो सकता है कि यह FK कॉलम के साथ दो या तीन कॉलमों पर एक इंडेक्स बनाने के लिए समझ में आता हो। आपके परिदृश्य और आपके डेटा पर निर्भर करता है।


8

प्रदर्शन के कारणों के लिए एक सूचकांक बनाया जाना चाहिए। प्राथमिक तालिका पर हटाए गए संचालन में उपयोग किया जाता है (यह जांचने के लिए कि जिस रिकॉर्ड को आप हटा रहे हैं, उसका उपयोग नहीं किया गया है) और जुड़ने में आमतौर पर एक विदेशी कुंजी शामिल होती है। केवल कुछ तालिकाओं (मैं उन्हें लॉग में नहीं बनाता) हो सकता है कि सूचकांक की आवश्यकता न हो, लेकिन शायद, इस मामले में शायद आपको विदेशी कुंजी बाधा की भी आवश्यकता नहीं है।

परंतु

कुछ डेटाबेस हैं जो पहले से ही विदेशी कुंजी पर स्वचालित रूप से अनुक्रमित बनाते हैं। जेट इंजन (माइक्रोसॉफ्ट एक्सेस फाइल्स) फायरबर्ड MySQL

पक्का

SQL सर्वर Oracle

नहीं करता


3
यह उल्लेख करने के लिए Thx कि FIrebird SQL यह स्वचालित रूप से करता है। यही वह बिंदु है जिसकी मुझे तलाश थी।
user424855

1

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

यहाँ अधिकांश सामर्थ्य चयनात्मकता प्रतीत होगी: यदि इंडेक्स में मान अत्यधिक डुप्लिकेट होंगे तो यह इंडेक्स छोड़ने के लिए बेहतर प्रदर्शन दे सकता है (यदि संभव हो तो) और टेबल स्कैन की अनुमति देता है।


1

UNIQUE, PRIMARY KEY, और FOREIGN KEY बाधाएँ ऐसे सूचकांक उत्पन्न करती हैं जो बाधा को लागू करते हैं या "वापस कभी-कभी अनुक्रमणिका कहते हैं"। प्राथमिक कुंजी बाधाएं अद्वितीय अनुक्रमित उत्पन्न करती हैं। विदेशी कुंजी बाधाओं गैर-अद्वितीय अनुक्रमित उत्पन्न करते हैं। यदि सभी कॉलम नॉन-नॉलेबल हैं, तो UNIQUE बाधाएं अनूठे इंडेक्स उत्पन्न करती हैं, और यदि एक या अधिक कॉलम नॉलेबल हैं, तो वे गैर-अद्वितीय इंडेक्स उत्पन्न करते हैं। इसलिए, यदि किसी स्तंभ या स्तंभ के सेट में UNIQUE, PRIMARY KEY, या FOREIGN KEY बाधा है, तो आपको प्रदर्शन के लिए उन स्तंभों पर अनुक्रमणिका बनाने की आवश्यकता नहीं है।



आपके द्वारा लिंक किए गए दस्तावेज़ डर्बी के लिए हैं, एम्बेडेड जावा डेटाबेस के लिए, ओरेकल के लिए नहीं।
दावोस 5
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.