2010-11-08 13 views
93

मेरे पास एक टेबल A और एक तालिका B है। AB पर B की प्राथमिक कुंजी, B_ID पर एक विदेशी कुंजी है।क्या मुझे विदेशी कुंजी पर इंडेक्स बनाने की ज़रूरत है?

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

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

उत्तर

109

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

+8

कुछ एक विदेशी कुंजी बाधा बनाने डेटाबेस पर करता भी अनुक्रमणिका बनाता है ... यानी जेट इंजन (एमएसएप फाइलें, फायरबर्ड और माईएसक्यूएल) – bubi

+3

यह उत्तर स्पष्ट रूप से किसी विशेष डेटाबेस कार्यान्वयन का जिक्र किए बिना व्यर्थ है। निश्चित रूप से प्रश्न 'ओरेकल' टैग किया गया है लेकिन जब आप Google खोज से यहां उतरते हैं तो यह तुरंत स्पष्ट नहीं होता है। – developerbmw

+2

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

35

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

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

12

एसक्यूएल सर्वर ने कभी भी विदेशी कुंजी कॉलम पर इंडेक्स नहीं डाले हैं - इस शहरी मिथक की पृष्ठभूमि और इतिहास पर किम ट्रिप के excellent blog post देखें।

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

20

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

अधिकांश समय की, हालांकि, आप एक सूचकांक बनाने के लिए (वास्तव में, ओरेकल एपेक्स में वहाँ "unindexed विदेशी कुंजी" की एक रिपोर्ट है) चाहते हैं।

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

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

0

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

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

3

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

लेकिन

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

यकीन

एसक्यूएल सर्वर के लिए ओरेकल

नहीं

+2

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

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