2011-10-12 24 views
24

मैं डीबी लड़का नहीं हूँ। लेकिन मुझे टेबल बनाने और सीआरयूडी संचालन करने की जरूरत है। मुझे भ्रमित हो जाना चाहिए क्या मैं डिफ़ॉल्ट रूप से द्वारा सभी कॉलम पर इंडेक्स बना सकता हूं या नहीं? यहां मेरी समझ है जो मैं सूचकांक बनाते समय विचार करता हूं।डेटाबेस में तालिका कॉलम पर इंडेक्स बनाने का निर्णय कब होता है?

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

इस परिदृश्य पर विचार करें जहां मेज mytable शामिल दो तीन स्तंभों अर्थात col1, col2, col3। अब हम इस क्वेरी को

select col1,col2 from mytable 

अब यहां दो मामले हैं। पहले मामले में हम col1 और col2 पर इंडेक्स बनाते हैं। दूसरे मामले में हम कोई अनुक्रमणिका नहीं बनाते हैं। ** मेरी समझ के अनुसार केस 1 केस 2 से तेज़ होगा क्योंकि यदि 1 ऑरैकल कॉलम मेमोरी लोकेशन को तुरंत ढूंढ सकता है। तो यहां मैंने किसी भी कॉलम का उपयोग नहीं किया है लेकिन अभी भी इंडेक्स यहां सहायता कर रहा है। इसलिए मैं सूचकांक यहाँ या नहीं बनाने पर विचार करना चाहिए? **

क्या होगा यदि एक ही स्थिति में ऊपर अगर हम

select * from mytable 

select col1,col2 from mytable 

विल सूचकांक मदद यहाँ के बजाय आग?

+8

इंडेक्स SELECT क्लॉज में मानों के लिए कुछ भी नहीं करता है। आपके ऑन क्लॉज या आपके WHERE क्लॉज में फ़ील्ड की सूची क्या मायने रखती है। – Bill

+0

@ बिल - क्या ओरेकल इंडेक्स को कवर करते समय उपयोग नहीं करता है? मैं एक एसक्यूएल सर्वर लड़का हूं और मुझे पता है कि ओरेकल इंडेक्स को थोड़ा अलग तरीके से संभालता है, लेकिन मैंने सोचा कि कुछ मामलों में यह अभी भी इंडेक्स को कवर करने का उपयोग करता है। –

+0

@ टॉम: हुह। प्रति दिन कुछ नया सीखें। मैं भी एक एमएसएसएलएल लड़का हूं और इसे नहीं जानता था। फिर भी, ऐसा लगता है कि कवरेज इंडेक्स केवल तभी उपयोगी होता है जब आप बहुत सारे आर और बहुत सीयूडी नहीं कर रहे हों। – Bill

उत्तर

12

लेकिन स्तंभ मान का अद्यतन अभ्यस्त सूचकांक मूल्य पर कोई प्रभाव। सही?

नहीं। अनुक्रमित कॉलम को अपडेट करना एक प्रभाव होगा।ओरेकल 11g performance manual कहा गया है कि:

अद्यतन बयान है कि अनुक्रमित स्तंभ संशोधित और डालें और बयान है कि संशोधित अनुक्रमित तालिकाओं अगर वहाँ थे कोई सूचकांक से अधिक समय लग हटाएँ। ऐसे SQL कथनों को तालिकाओं में अनुक्रमणिका और डेटा में डेटा को संशोधित करना होगा। वे अतिरिक्त पूर्ववत और फिर से बनाते हैं।


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

सिर्फ आवेषण, लेकिन किसी भी अन्य डेटा हेरफेर भाषा बयान।

इस परिदृश्य पर विचार करें। । । सूचकांक यहां मदद करेगा?

इस अंतिम अनुच्छेद के संबंध में, प्रतिनिधि डेटा वॉल्यूम के साथ कुछ परीक्षण मामलों का निर्माण क्यों न करें ताकि आप अपनी धारणाओं को साबित या अस्वीकार कर सकें कि आपको कौन से कॉलम इंडेक्स करना चाहिए?

25

हर कॉलम में इंडेक्स बनाने मत करो! यह चीजों को सम्मिलित/हटाए/अपडेट ऑपरेशंस पर धीमा कर देगा।

एक साधारण अनुस्मारक के रूप में, आप WHERE, ORDER BY और GROUP BY खंडों में सामान्य कॉलम में एक अनुक्रमणिका बना सकते हैं। (उदाहरण के लिए एक JOIN के माध्यम से,) colums कि अन्य तालिकाओं से संबंधित उपयोग किया जाता है में एक सूचकांक जोड़ने

उदाहरण पर विचार हो सकता है:

SELECT col1,col2,col3 FROM my_table WHERE col2=1 

यहाँ, col2 पर एक सूचकांक बनाने इस क्वेरी एक बहुत मदद मिलेगी।

इसके अलावा, सूचकांक चयनात्मकता पर विचार करें। सीधे शब्दों में कहें, उन मानों पर इंडेक्स बनाएं जिनके पास "बड़ा डोमेन" है, यानी आईडी, नाम इत्यादि। उन्हें नर/मादा कॉलम पर न बनाएं।

1

मैं उम्मीद ओरेकल सीधे एक ही पंक्ति से सभी क्षेत्रों पाने के लिए उपलब्ध है, अतिरिक्त अनुक्रमणिका (जो वास्तव में इस बात के लिए तैयार किया गया है नहीं कर रहे हैं) की आवश्यकता के बिना।

इसके अलावा, इंडेक्स में बहुत सी डिस्क स्पेस और मेमोरी और सीपीयू उपयोग होगा।

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

क्या मैं इस आखिरी बिंदु पर सही हूं?

(यदि आप एक का चयन करें * आग हैं, के रूप में मेरे लिए यह बिल्कुल वैसा ही है, जितना डेटा नेटवर्क के माध्यम से जाना होगा के लिए सुरक्षित।)

2

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

ओरेकल में ढेर या इंडेक्स संगठित तालिकाओं सहित कई अलग-अलग टेबल हैं।

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

वास्तव में उपयोग किए जाने वाले कॉलम के साथ इंडेक्स बनाना वास्तव में केवल तभी मदद करता है जब वे इंडेक्स को कवर करने की अधिक संभावना रखते हैं, लेकिन सभी कॉलम जोड़ना इंडेक्स संगठित तालिका के समान होगा। ध्यान दें कि ओरेकल में SQL सर्वर के INCLUDE (COLUMN) के बराबर नहीं है जिसका उपयोग इंडेक्स को अधिक कवर करने के लिए किया जा सकता है (यह प्रभावी रूप से कॉलम के केवल एक सबसेट का एक अतिरिक्त क्लस्टर इंडेक्स बना रहा है - उपयोगी यदि आप एक इंडेक्स अद्वितीय होना चाहते हैं लेकिन कुछ डेटा भी जोड़ें जिसे आप विशिष्टता में नहीं मानना ​​चाहते हैं लेकिन इसे अधिक प्रश्नों के लिए कवर करने में मदद करता है)

आपको अपनी योजनाओं को देखना होगा और फिर यह निर्धारित करना होगा कि इंडेक्स चीजों की मदद करेगा या नहीं। और उसके बाद योजनाओं को देखने के लिए देखें कि क्या उन्होंने कोई फर्क नहीं पड़ता है।

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