2009-03-26 17 views
15

मेरे पास एक ऐप है, जो डेटाबेस तालिका में बड़ी संख्या में रिकॉर्ड्स के माध्यम से चक्र चलाता है और उस डेटाबेस के भीतर रिकॉर्ड्स पर कई SQL और .Net संचालन करता है (वर्तमान में मैं PostgreSQL पर Castle.ActiveRecord का उपयोग कर रहा हूं)।डेटाबेस इंडेक्स बनाने के लिए कुछ सर्वोत्तम प्रथाओं और "अंगूठे के नियम" क्या हैं?

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

मैं समझता हूं कि प्रदर्शन करते समय प्रदर्शन में कमी है (डेटाबेस को इंडेक्स को अपडेट करने की आवश्यकता है, साथ ही साथ डेटा), लेकिन डेटाबेस इंडेक्स बनाने के साथ मुझे किन सुझावों और सर्वोत्तम प्रथाओं पर विचार करना चाहिए? मैं डेटाबेस इंडेक्स (अंगूठे के नियम) के सेट के लिए फ़ील्ड के फ़ील्ड/संयोजन का सबसे अच्छा चयन कैसे करूं?

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

उत्तर

34

अंगूठे का मेरा नियम से कुछ:

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

तो एक प्रश्न धीमी है, कार्य योजना लागू करके देखते हैं और:

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

यह उत्तर एक अच्छी शुरुआत है लेकिन कुछ तरीकों से थोड़ा सा सरल है। सभी विदेशी कुंजियों को अनुक्रमणित करना हमेशा सही नहीं होता है क्योंकि कभी-कभी डेटा हमेशा एफके से माता-पिता तक जाता है। हमेशा उच्चतम कार्डिनिटी को पहले रखना बेकार है अगर कभी पूछताछ नहीं की जाती है। और कई और चीजें। [इस पोस्ट को पढ़ना] (http://stackoverflow.com/questions/3293156/effects-of-clustered-index-on-db-performance/3295528#3295528) कुछ पाठकों के लिए उपयोगी हो सकता है। – ErikE

3

यहां थोड़ा सा सरल अवलोकन है: यह निश्चित रूप से सच है कि इंडेक्स की उपस्थिति के कारण डेटा संशोधनों के ऊपर एक ओवरहेड है, लेकिन आपको डेटा को पढ़ने और लिखने की सापेक्ष संख्या पर विचार करना चाहिए। आम तौर पर पढ़ने की संख्या लिखने की संख्या से कहीं अधिक है, और आपको इंडेक्सिंग रणनीति को परिभाषित करते समय इसे ध्यान में रखना चाहिए।

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

2

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

अज्ञात उत्पादन वर्कलोड के तहत महत्वपूर्ण इंडेक्स अक्सर अनुमान लगाने/अनुमान लगाने के लिए कठिन होते हैं, और इंडेक्स का एक सेट सेट के रूप में नहीं देखा जाना चाहिए और भूलना चाहिए। इंडेक्स की निगरानी की जानी चाहिए और बदलते वर्कलोड के साथ बदलना चाहिए (उदाहरण के लिए, नई हत्यारा रिपोर्ट)।

कुछ भी प्रोफाइलिंग धड़कता नहीं है; यदि आप अपनी अनुक्रमणिका का अनुमान लगाते हैं, तो आप अक्सर वास्तव में महत्वपूर्ण लोगों को याद करेंगे।

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

इसके अलावा, सुनिश्चित करें कि अनुसूचित सूचकांक रखरखाव योजना भी बनाई गई है।

+0

'अनुसूचित इंडेक्स रखरखाव योजना' के साथ आपका क्या मतलब है? – tuinstoel

+0

@tuinstoel: सुनिश्चित नहीं है कि मैं इसका वर्णन कैसे कर सकता हूं। सभी उत्पादन डीबी के पास नियमित रखरखाव योजना के हिस्से के रूप में खंडित इंडेक्स पुनर्निर्मित होना चाहिए। –

+1

मुझे लगता है कि डीबी विक्रेता विशिष्ट है। ओरेकल दुनिया में पुनर्निर्माण बीटी इंडेक्स को एक बुरा अभ्यास माना जाता है। – tuinstoel

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