2013-10-25 12 views
6

मैं मेजओरेकल: एकल एकाधिक सूचकांक या दो एकल स्तंभ अनुक्रमणिका

create table1(
    column1 number(10, 
    column2 number(10), 
    column3 number(10) 
); 

column1 प्राथमिक कुंजी column2 और column3 है 2 कॉलम

पर विदेशी कुंजी

मैं बनाया है अद्वितीय बाधा है

alter table table1 
     add constraint table1_contr1 unique(column1,column2) 
     using index tablespace tbs1; 

जब मैं इंडेक्स बनाने गया दोनों कॉलम पर

create index table1_idx1 on table1(column1,coulmn2); 

ERROR at line 1: 
ORA-01408: such column list already indexed 

तो जब मैं अद्वितीय बाधा उत्पन्न करता हूं तो ओरेकल पहले ही इंडेक्स बना देता है। लेकिन अगर मैं अलग सूचकांक बनाने यह स्वीकार कर रहा है उन

create index table1_idx1 on table1(column1); 
create index table2_idx2 on table2(column2); 

अब मेरे सवाल है, दोनों स्तंभ मैं अभी भी प्रत्येक स्तंभ पर एक सूचकांक बनाने के बारे में चिंता करने की जरूरत है पर अद्वितीय बाधा होने के बाद? क्या ऑब्जेक्ट तक पहुंचने पर प्रत्येक कॉलम पर इंडेक्स के बिना प्रदर्शन पर असर पड़ेगा?

यह ऑरैकल 11R2 पर है।

+1

जब आप कहते हैं कि 'कॉलम 2' और' कॉलम 3 'विदेशी कुंजी हैं, तो क्या आपका मतलब है कि' कॉलम 2, कॉलम 3 'का संयोजन एक समग्र प्राथमिक कुंजी के साथ एक एकल मूल तालिका के लिए एक विदेशी कुंजी है? या प्रत्येक कॉलम प्राथमिक कुंजी के साथ पैरेंट टेबल को अलग करने के लिए 'कॉलम 2' और 'कॉलम 3' में से प्रत्येक विदेशी कुंजी हैं? यदि 'कॉलम 1' पहले से ही प्राथमिक कुंजी है, तो आप 'कॉलम 1' और 'कॉलम 2' के संयोजन पर एक अद्वितीय बाधा क्यों बना रहे हैं। 'कॉलम 1' पहले से ही अद्वितीय है इसलिए इसका संयोजन और कुछ भी अद्वितीय होगा। क्या आपका मतलब था कि आप 'col2, col3' पर एक अद्वितीय बाधा बना रहे हैं? –

+0

मुझे खेद है, टाइपो त्रुटि। मैं अद्वितीय बाधा बना रहा हूं (col2, col3)। – user2824874

उत्तर

9

यह निर्भर करता है ...

यह काफी संभावना नहीं है कि सिर्फ column1 पर एक सूचकांक अगर आप पहले से column1, column2 पर एक समग्र सूचकांक है फायदेमंद होगा है। चूंकि column1 अग्रणी इंडेक्स है, तालिका के विरुद्ध प्रश्न जो केवल column1 है, एक अनुमान के रूप में समग्र सूचकांक का उपयोग करने में सक्षम हो जाएगा। यदि आप अक्सर ऐसे प्रश्नों को चला रहे हैं जिन्हें इंडेक्स का पूर्ण स्कैन करने की आवश्यकता है और column2 की उपस्थिति सूचकांक के आकार को काफी हद तक बढ़ाती है, तो यह संभव है कि column1 पर एक सूचकांक अधिक कुशल होगा क्योंकि पूर्ण इंडेक्स स्कैन की आवश्यकता होगी कम I/O करो लेकिन यह एक बहुत असामान्य स्थिति है।

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

0

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

एकल कॉलम के लिए इंडेक्स बनाना आपके पढ़ने के प्रदर्शन में सुधार नहीं करेगा, हालांकि यह आपके लेखन को छोड़ देगा और प्रदर्शन AFAIK अपडेट करेगा।

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