यदि कोई सूचकांक आवश्यक या आवश्यक है तो यह कैसे निर्धारित किया जाए


110

मैं अपने MS SQL डेटाबेस पर एक ऑटो-इंडेक्स टूल चला रहा हूं (मैंने Microsoft से उत्पन्न एक स्क्रिप्ट को संशोधित किया है जो इंडेक्स स्टैटिस टेबल - ऑटोमेटेड ऑटो इंडेक्सिंग को देखता है )। आंकड़ों से, अब मेरे पास इंडेक्स की सिफारिशों की एक सूची है जो बनाने की आवश्यकता है।

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

(स्क्रिप्ट्स क्या कर रहे हैं, यह स्पष्ट करने के लिए नीचे लैरी कोलमैन के उत्तर से आंशिक रूप से संपादित करें)

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

क्या मुझे SQL Profiler चलाने की आवश्यकता है, या क्या तालिकाओं की जांच करने वाले कोड की जांच करना बेहतर है? और क्या आपके पास कोई और सलाह है?


1
इस लेख पर एक नज़र डालें sqlserverperformance.wordpress.com/2007/11/29/...
इगोर Borisenko

अनुपयोगी इंडेक्स की जांच करें। लेख आपकी मदद कर सकता है: sqlshack.com/…
शिवांगिनी शिशुलकर

जवाबों:


80

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

सबसे महत्वपूर्ण बात, हालांकि, यह सुनिश्चित करने के बारे में है कि एप्लिकेशन उपयोगकर्ताओं के लिए पर्याप्त तेजी से प्रतिक्रिया करता है।

अपडेट: नई स्क्रिप्ट के लिए जेसन स्ट्रेट के सूचकांक विश्लेषण ब्लॉग लेख (नया स्थान)

डबल अपडेट: इन दिनों, मैं सूचकांक विश्लेषण करते समय sp_BlitzIndex® का उपयोग करता हूं


सभी तालिकाओं का विश्लेषण करने के लिए हमें किन परिवर्तनों की आवश्यकता है?
मॉन्स्टरमोरपीजी

1
sp_BlitzIndex एक निश्चित आकार के ऊपर सभी तालिकाओं को देखेगा। आपको इसे कैसे समायोजित किया जाए, यह देखने के लिए आपको दस्तावेज़ देखने जाना होगा।
यिर्मयाह पेश्का

Sp_BlitzIndex निष्पादित करने के लिए पैरामीटर यहाँ हैं: brentozar.com/blitzindex
JackArbiter

कोई ट्रिपल अपडेट?
साइमन_विवर

49

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

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

आमतौर पर, एक छोटे डेटा सेट को भौतिक रूप से क्वेरी करने के कारण, स्कैन की तुलना में ऑपरेशन अधिक कुशल होते हैं। ऐसी परिस्थितियां हैं जहां यह मामला नहीं है, जैसे कि एक बहुत छोटा प्रारंभिक डेटा सेट, लेकिन यह आपके प्रश्न के दायरे से परे है।

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

यह निर्धारित करने के लिए कि कोई इंडेक्स कितना प्रभावी है, आपको अपने इंडेक्स कीज़ की चयनात्मकता निर्धारित करनी चाहिए। चयनात्मकता को विभिन्न रिकॉर्डों के कुल रिकॉर्ड के प्रतिशत के रूप में परिभाषित किया जा सकता है। यदि मेरे पास 100 कुल रिकॉर्ड के साथ एक [व्यक्ति] टेबल है और [पहले_नाम] कॉलम में 90 अलग-अलग मूल्य हैं, तो हम कह सकते हैं कि [पहला_नाम] कॉलम 90% चयनात्मक है। उच्च चयनात्मकता, सूचकांक कुंजी जितनी अधिक कुशल होगी। चयनात्मकता को ध्यान में रखते हुए, अपने सबसे चयनात्मक कॉलम को अपनी इंडेक्स कुंजी में पहले रखना सबसे अच्छा है। मेरे पिछले [व्यक्ति] उदाहरण का उपयोग करते हुए, यदि हमारे पास [last_name] कॉलम था जो कि 95% चयनात्मक था? हम इंडेक्स कुंजी के रूप में [last_name], [first_name] के साथ एक इंडेक्स बनाना चाहेंगे।

मुझे पता है कि यह एक लंबा-चौड़ा जवाब था, लेकिन वास्तव में बहुत सारी चीजें हैं जो यह निर्धारित करती हैं कि एक सूचकांक कितना प्रभावी होगा, और बहुत सी चीजें आपको किसी भी प्रदर्शन लाभ के खिलाफ तौलना चाहिए।


1
मैं बस ऊपर बताई गई बातों पर जोर देना चाहता हूं: इंडेक्स आपके आवेषण / डिलीट और अपडेट को धीमा कर देता है। यदि आपको कहना है कि बड़ी मात्रा में डेटा डालें, तो आप इंडेक्स के बिना बेहतर हैं (आप इसे बाद में बना सकते हैं, यह तेज है)।
निकोलस डी फोंटने

क्या यह उल्लेख करना सही होगा कि इंडेक्स [last_name], [first_name] कॉलम पर ही उपयोग किया जा सकता है अगर क्वेरी last_name और first_name पर फ़िल्टर हो? यदि यह केवल first_name पर फ़िल्टर करता है, तो सूचकांक का उपयोग नहीं किया जा सकता है, क्या यह हो सकता है?
मगियर

अच्छा जवाब - चयन करना कार्डिनैलिटी से अधिक महत्वपूर्ण है जब यह तय किया जाए कि क्या इंडेक्स किया जाए
उल्टा इंजीनियर

27

मैंने हाल ही में ब्रेंटऑज़र ​​अनलडेंट http://www.brentozar.com/blitzindex/ पर लोगों से एक शानदार मुफ्त स्क्रिप्ट की खोज की है

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

यह मार्गदर्शन आम तौर पर अच्छा है। कभी-कभी यह विचारों का थोड़ा अधिक विचारोत्तेजक हो जाता है। मैंने आम तौर पर अब तक निम्नलिखित किया है:

  • हटाए गए अनुक्रमित जिन्हें कभी पढ़ा गया है (या शायद महीने में 50 बार से कम)।
  • विदेशी कुंजी और क्षेत्रों पर सबसे स्पष्ट अनुक्रमित जोड़े गए हैं मुझे पता है कि हम बहुत उपयोग करते हैं।

मैंने सभी अनुशंसित इंडेक्स को नहीं जोड़ा है, और एक सप्ताह बाद वापस पाया है कि वे अब अनुशंसित नहीं हैं क्योंकि क्वेरी इंजन इसके बजाय कुछ अन्य नए इंडेक्स का उपयोग कर रहा है!

आम तौर पर आपको अनुक्रमित से बचना चाहिए:

  • बहुत छोटी तालिकाओं (50 से 200 से कम रिकॉर्ड): अक्सर क्वेरी इंजन तेज होता है यदि यह सूचकांक को लोड करने के बजाय तालिका को स्कैन करता है, पढ़ता है, इसे संसाधित करता है आदि।
  • पहले उल्लेखित स्तंभ पर कम कार्डिनैलिटी ( http://en.wikipedia.org/wiki/Cardinality_(SQL_statements) वाले स्तंभों पर अनुक्रमित से बचें । जैसे लिंग क्षेत्र (M / F) अनुक्रमण बहुत कम उपयोग का है, यह टेबल को स्कैन करने और ~ 50% मैच खोजने के लिए व्यावहारिक है। यदि इसे इंडेक्स में कुछ और विशिष्ट के बाद सूचीबद्ध किया जाता है (जैसे [जन्म तिथि, लिंग]) जो बेहतर है - आप चाहते हैं कि सभी पुरुष एक निश्चित समय अवधि में पैदा हों।

क्लस्टर किए गए इंडेक्स अच्छे हैं - आम तौर पर ये आपकी प्राथमिक कुंजी पर आधारित होते हैं। वे डेटाबेस इंजन को डिस्क पर डेटा को अच्छे क्रम में रखने में मदद करते हैं। सबसे बड़ी तालिकाओं के लिए इसे समझने के लिए बहुत आवश्यक है क्योंकि एक अच्छा क्लस्टर इंडेक्स अक्सर उस स्थान को कम कर देता है जिस पर तालिका का कब्जा होता है।

मैंने कुछ टेबल को 900MB से घटाकर 400MB कर दिया है, सिर्फ इसलिए कि वे पहले से बिना रुके ढेर थे। http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

पुनर्संगठित / पुनर्निर्माण

आपको खंडित अनुक्रमितों की जांच करनी चाहिए। थोड़ा विखंडन ठीक है, जुनूनी नहीं है! http://technet.microsoft.com/en-us/library/ms189858.aspx पुनर्गठन और पुनर्निर्माण के बीच अंतर को जानें!

नियमित रूप से समीक्षा करें

क्वेरीज़ बदल जाती हैं, डेटा वॉल्यूम बदल जाते हैं, नई सुविधाएँ जुड़ जाती हैं, पुराने हटा दिए जाते हैं। आपको उन्हें महीने में एक बार (या अधिक बार यदि आपके पास उच्च मात्रा है) देखना चाहिए और जहां आप डेटाबेस की मदद कर सकते हैं, वहां देख रहे हैं!

कितने

हाल ही में एक वीडियो ब्रेंट सिफारिश की गई है (आमतौर पर) लेखन के बहुत सारे के साथ एक मेज पर कोई अधिक 5 अनुक्रमित (जैसे आदेश तालिका), और कोई 10 से अधिक में यह एक बहुत लिखा की तुलना में अधिक (विश्लेषण के लिए यानी प्रवेश तालिका) पढ़ी जाती है http: / /www.youtube.com/watch?v=gOsflkQkHjg

संपूर्ण

निर्भर करता है!

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

उम्मीद है की यह मदद करेगा!


14

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

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

इसलिए यदि आप मेरे विचार का अनुसरण करते हैं, तो एक इंडेक्स जोड़ना और प्रभाव को मापना वास्तव में ए / बी परीक्षण का मामला है : आप अपना वर्कलोड w / o इंडेक्स को आधार रेखा के रूप में चलाते हैं, फिर आप इसे इंडेक्स के साथ चलाते हैं, मापते हैं और तुलना करते हैं आधार रेखा के साथ और फिर निर्णय लें, अवलोकन और मापा मैट्रिक्स के आधार पर, यदि प्रभाव फायदेमंद है। वर्कलोड सबसे अच्छी क्वालिटी का टेस्ट सूट है, लेकिन यह एक कैप्चर किए गए वर्कलोड का रिप्ले भी हो सकता है, देखें कैसे: ट्रेस फाइल को रीप्ले करें

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


7

SQL 2005 के साथ शुरू, SQL सर्वर में DMV है जो आपको बताता है कि डेटाबेस इंजन इंडेक्स के लिए उपयोग करेगा यदि वे उपलब्ध थे। विचार आपको बता सकते हैं कि कौन से कॉलम में प्रमुख कॉलम होना चाहिए, कौन से कॉलम को शामिल किया जाना चाहिए, और सबसे महत्वपूर्ण बात यह है कि इंडेक्स का उपयोग कितनी बार किया गया होगा।

एक अच्छा तरीका यह है कि लापता अनुक्रमित क्वेरी को संख्या की संख्या के आधार पर क्रमबद्ध किया जाए, और पहले शीर्ष अनुक्रमों को जोड़ने पर विचार करें।

इसे भी देखें: आधिकारिक MS DMV डॉक्स


-1

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

कुछ आँकड़े प्रश्न हैं जो बताते हैं कि प्रश्न कितने समय ले रहे हैं। सबसे धीमी गति से शुरू करें। यदि क्वेरी विधेय का कोई इंडेक्स नहीं है, तो एक बनाने से मदद मिलेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.