2008-09-17 15 views
8

ओरेकल में टेबल के साथ काम करते समय, आप कैसे जानते हैं कि जब आप एक खराब इंडेक्स बनाम एक अच्छी अनुक्रमणिका बना रहे हैं?आप कैसे जानते हैं कि एक अच्छी अनुक्रमणिका क्या है?

+0

यह भी देखें https://stackoverflow.com/questions/107132/what-columns-generally-make-good-indexes/। – fdelia

उत्तर

20

यह 'अच्छा' और 'बुरा' से आपका क्या मतलब है इस पर निर्भर करता है। असल में आपको यह समझने की आवश्यकता है कि आपके द्वारा जोड़े गए प्रत्येक इंडेक्स में उस कॉलम द्वारा किसी भी खोज पर प्रदर्शन बढ़ जाएगा (इसलिए किसी व्यक्ति तालिका के 'अंतिम नाम' कॉलम में एक इंडेक्स जोड़ना उन प्रश्नों पर प्रदर्शन बढ़ाएगा जिनमें "अंतिम नाम =" है) लेकिन पूरी तालिका में लेखन प्रदर्शन कम करें।

इसका कारण यह है कि जब आप पंक्ति जोड़ते हैं या अपडेट करते हैं, तो उसे तालिका दोनों को जोड़ना या अपडेट करना होगा और पंक्ति के प्रत्येक सूचकांक का सदस्य होना चाहिए। इसलिए यदि आपके पास एक टेबल पर पांच इंडेक्स हैं, तो प्रत्येक अतिरिक्त को छह स्थानों पर लिखना होगा - पांच इंडेक्स और टेबल - और एक अपडेट सबसे खराब मामले में छः स्थानों तक छू सकता है।

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

तो संक्षेप में, कॉलम में इंडेक्स जोड़ें जो कि चुनिंदा प्रश्नों में बहुत अधिक उपयोग किए जाते हैं, लेकिन बहुत अधिक जोड़ने से बचने का प्रयास करें और इसलिए सबसे अधिक इस्तेमाल किए गए कॉलम को पहले जोड़ें।

उसके बाद लोड परीक्षण का मामला यह देखने के लिए कि उत्पादन परिस्थितियों के तहत प्रदर्शन कैसे प्रतिक्रिया करता है, और एक अचूक संतुलन खोजने के लिए बहुत सारे tweaking।

2

यहाँ एक महान एसक्यूएल सर्वर लेख है: http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

यांत्रिकी ओरेकल पर काम नहीं करेगा हालांकि, टिप्स बहुत अनुरूप हैं (ऋण क्लस्टर अनुक्रमित पर बात, जो काफी में एक ही तरह से काम नहीं करते आकाशवाणी)।

-2

एक अच्छी अनुक्रमणिका कुछ है जो आप एक विशिष्ट तालिका पंक्ति के लिए अद्वितीय होने पर भरोसा कर सकते हैं।

एक सामान्यतः उपयोग की जाने वाली इंडेक्स योजना उन संख्याओं का उपयोग है जो तालिका में प्रत्येक पंक्ति के लिए 1 से बढ़ती हैं। प्रत्येक पंक्ति एक अलग संख्या सूचकांक समाप्त हो जाएगा।

6

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

एक काउंटररेक्स नमूना लिंग होगा - केवल दो सामान्य मान हैं, इसलिए सूचकांक ' टी वास्तव में उन पंक्तियों की संख्या को कम करने में मदद करता है जिन्हें स्कैन किया जाना चाहिए।

पूर्ण-लंबाई वर्णनात्मक मुक्त-फॉर्म स्ट्रिंग खराब इंडेक्स बनाते हैं, क्योंकि जो कोई भी क्वेरी कर रहा है वह शायद ही कभी स्ट्रिंग के सटीक मान को जानता है।

रैखिक रूप से आदेशित डेटा (जैसे टाइमस्टैम्प या तिथियां) आमतौर पर क्लस्टर्ड इंडेक्स के रूप में उपयोग किए जाते हैं, जो पंक्तियों को इंडेक्स ऑर्डर में संग्रहीत करने के लिए मजबूर करता है, और इन-ऑर्डर एक्सेस की अनुमति देता है, बहुत तेज़ी से रेंज पूछताछ (जैसे 'मुझे दे दो अक्टूबर और दिसंबर के बीच सभी बिक्री आदेश ')। ऐसे मामले में डीबी इंजन बस सीमा से निर्दिष्ट पहले रिकॉर्ड की तलाश कर सकता है और आखिरी बार हिट होने तक अनुक्रमिक रूप से पढ़ना शुरू कर सकता है।

2

@ इन्फैमस गाय - आपको प्राथमिक कुंजी के बारे में सोचना चाहिए, इंडेक्स नहीं।

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

विभिन्न प्रकार के इंडेक्स और उनके पेशेवरों और विपक्ष का विवरण यहां उपलब्ध है: http://20bits.com/2008/05/13/interview-questions-database-indexes/

+0

कृपया इस पर जानकारी संकलित करने के लिए स्वतंत्र महसूस करें और इसे डेटाबेस अनुक्रमण पर मेरे लिंक किए गए पोस्ट में जोड़ें। –

0

अगर आप किसी विशेष क्वेरी को बेहतर बनाने की कोशिश कर रहे हैं तो अंगूठे के कुछ नियम।

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

उदाहरण के लिए:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200 

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

वैकल्पिक रूप से, अगर चयन और कहां खंड में सभी मान इंडेक्स में हैं तो ओरेकल को तालिका पंक्ति तक पहुंचने की आवश्यकता नहीं होगी। इसलिए कभी-कभी चयनित मूल्यों को इंडेक्स में रखना एक अच्छा विचार है और एक साथ टेबल एक्सेस से बचें।

आप सूचकांक के सर्वोत्तम तरीकों के बारे में एक पुस्तक लिख सकते हैं - लेखक जोनाथन लुईस के लिए देखो।

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

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