2016-01-10 7 views
5

पर विचार करें this ओरेकल अनुक्रमित के बारे में डॉक्स, this StackOverflow पर डालने की गति और this प्रश्न के बारे में मुझे निष्कर्ष यह है कि करने के लिए नेतृत्व:INSERT और UPDATE परिचालनों में इंडेक्स का उपयोग कब और कब किया जाता है?

  • इंडेक्स हमें पता लगाने जानकारी तेजी
  • प्राथमिक और अद्वितीय कुंजी स्वतः अनुक्रमित रहे हैं
  • में मदद करता है इंडेक्स के साथ सम्मिलित करने से खराब प्रदर्शन

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

मेरा प्रश्न है: INSERT और UPDATE परिचालनों में प्रयुक्त इंडेक्स हैं? कब और कैसे?

मेरे सुझाव हैं:

  • UPDATE (यदि खंड में स्तंभ अनुक्रमणिका है) WHERE खंड में सूचकांक का उपयोग कर सकते
  • INSERT जब SELECT का उपयोग करता इंडेक्स का उपयोग कर सकते हैं (लेकिन इस मामले में, सूची पत्र से है एक और टेबल)
  • या शायद जब ईमानदारी की कमी

जाँच लेकिन मैं ऐसी गहरी ज्ञान की जरूरत नहीं है इंडेक्स का उपयोग करने का डीजी।

+2

इंडेक्स सम्मिलित करें और अद्यतन संचालन के साथ किया जाता है। यदि आपके पास विदेशी कुंजी पर कोई अनुक्रमणिका नहीं है तो आप एक कुख्यात टीएम - विवाद घटना भी कर सकते हैं।ओरेकल निर्भर टेबल पर भी इंडेक्स का उपयोग करता है, न केवल उस तालिका पर जिसे आप काम कर रहे हैं। इंटरनेट और दस्तावेज़ीकरण में बहुत सी सामग्री हैं इसलिए मुझे नहीं लगता कि यहां पर चर्चा करने का एक बिंदु है। – stee1rat

+0

सावधान रहें, आपके लिंक में से एक (https://docs.oracle.com/cd/E17952_01/refman-5.1-en/insert-speed.html विशेष रूप से) mysql के लिए है, ओरेकल नहीं। दोनों डेटाबेस के लिए डॉक्स docs.oracle.com पर स्थित हैं, उन्हें भ्रमित करना आसान है। – Timekiller

+0

आपके उत्तरों के लिए धन्यवाद। मुझे पता था कि इंडेक्स का उपयोग केवल उन टेबलों पर नहीं किया जाता है जिनके साथ मैं काम कर रहा हूं। शायद मैं कुछ और मुश्किल पीछे की उम्मीद कर रहा था। :) –

उत्तर

0

सम्मिलित कथन का सूचकांक के लिए कोई प्रत्यक्ष लाभ नहीं है। लेकिन more index on a table cause slower insert operation। उस टेबल के बारे में सोचें जिस पर कोई अनुक्रमणिका नहीं है और यदि आप उस पर एक पंक्ति जोड़ना चाहते हैं, तो उसे टेबल ब्लॉक मिलेगा जिसमें पर्याप्त खाली स्थान होगा और उस पंक्ति को स्टोर करें। लेकिन अगर उस तालिका में इंडेक्स पर डेटाबेस है तो यह सुनिश्चित करना चाहिए कि इन नई पंक्तियों को इंडेक्स के माध्यम से भी पाया जाए, इसलिए इंडेक्स वाले टेबल पर नई पंक्तियां जोड़ने के लिए, इंडेक्स में भी प्रवेश करने की आवश्यकता है। यह सम्मिलन ऑपरेशन को गुणा करता है। So more index you have, more time you need to insert new rows

update it depends on whether you update indexed column or not के लिए। यदि आप अनुक्रमित कॉलम अपडेट नहीं कर रहे हैं तो प्रदर्शन प्रभावित नहीं होना चाहिए। Index can also speed up a update statements if the where conditions can make use of indexes

1

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

INSERT बयान के लिए हालांकि INSERT स्वयं इंडेक्स की आवश्यकता नहीं है, इंडेक्स को 'डालने' की भी आवश्यकता होगी, इसलिए ऑरैकल द्वारा एक्सेस किया जाना चाहिए। एक अन्य मामले में जहां डालने का कारण बन सकती सूचकांक में इस्तेमाल किया जा करने के लिए इस तरह एक सम्मिलित है: अगर तालिका विदेशी कुंजी या बाधाओं के अन्य प्रकार, उदाहरण के लिए अद्वितीय है

INSERT INTO mytable (mycolmn) 
SELECT mycolumn + 10 FROM mytable; 
संबंधित मुद्दे