क्या इंडेक्स स्पेस को डेटा स्पेस से बड़ा होना बुरा है?


22

अक्सर मुझे बड़ी टेबलों के विरुद्ध प्रश्न चलाने होते हैं जिनके पास सही सूचकांक नहीं है। इसलिए मैं डीबीए को ऐसे सूचकांक बनाने के लिए कहता हूं। पहली चीज़ जो वह करती है वह तालिका के आँकड़ों को देखती है और सूचकांक स्थान के आकार को देखती है।

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

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

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

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

हमें SQL Server 2008 का समर्थन करने की आवश्यकता है, क्योंकि परीक्षण DBs चालू है। लेकिन क्लाइंट 2014 और 2016 के सभी हैं।

जवाबों:


34

एक स्लाइडिंग स्विच की तरह सूचकांक डिजाइन के बारे में सोचो। इस लाल त्रिकोण स्विच घुंडी को आप अपनी इच्छानुसार कहीं भी ले जा सकते हैं:

सूचकांक डिजाइन निर्णय

मैं आमतौर पर इसे आकार के संदर्भ में नहीं मापता - मैं आमतौर पर सूचकांक की मात्रा के संदर्भ में सोचता हूं, लेकिन आकार भी ठीक होगा।

ऐसा लगता है कि आपका डीबीए सोचता है कि स्विच सही से बहुत दूर है - कि आपने बहुत सारे इंडेक्स जोड़े हैं, और डिलीट / अपडेट / इन्सर्ट बहुत धीरे-धीरे कर रहे हैं।

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

मेरा प्रारंभिक बिंदु आमतौर पर 5 और 5 है: प्रति तालिका लगभग 5 सूचकांक, प्रति सूचकांक लगभग 5 या उससे कम क्षेत्रों के साथ। उस संख्या के बारे में कुछ भी जादुई नहीं है - यह सिर्फ इस तथ्य से आता है कि मेरे पास प्रत्येक हाथ पर 5 उंगलियां हैं, इसलिए मेरे हाथों को पकड़ना और नियम की व्याख्या करना आसान है।

जब आपका वर्कलोड डिलीट / अपडेट / इन्सर्ट ऑपरेशंस के प्रति बहुत अधिक पक्षपाती हो, और आपके पास पर्याप्त हार्डवेयर हॉर्स पॉवर न हो, तो आपको 5 से कई LESS इंडेक्स की आवश्यकता हो सकती है।

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


4

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

जो संभवतः इंगित करता है कि आप टेबल पर एक संकुल या गैर-क्लस्टर किए गए कॉलमस्टोर सूचकांक से लाभ उठा सकते हैं ।

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

Columnstore Index को SQL Server 2016+ के साथ OLTP- भारी वर्कलोड में काम करने के लिए डिज़ाइन किया गया है। रियल-टाइम ऑपरेशनल एनालिटिक्स के लिए प्रलेखन देखें ।


3

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

यदि आपकी कंपनी में DBA स्थिति इस विषय की 'प्रभारी' है तो वे आपकी क्वेरी का विश्लेषण कर सकते हैं और बेहतर क्वेरी डिज़ाइन पर सुझाव दे सकते हैं या प्रदर्शन के लिए उत्तर दे सकते हैं।

यदि लक्ष्य प्राप्त करने के लिए क्वेरी और / या डेटा संरचना को संशोधित नहीं किया जा सकता है, तो मुझे लगता है कि यह तीन विकल्पों के लिए नीचे आता है।

  1. धीमा डेटा पुनर्प्राप्ति
  2. धीमा डेटा अद्यतन
  3. अधिक हार्डवेयर संसाधन $ $ $ $ $

बेशक हर स्थिति में कई व्यवसाय और प्रौद्योगिकी कारकों के आधार पर कई चर होते हैं, लेकिन मेरा मानना ​​है कि सभी मामलों में नहीं तो तीन विकल्प सबसे अधिक लागू होते हैं।


0

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

हालाँकि इस पर विचार करने के लिए कई चीजें हैं:

  • अनुक्रमणिका के बहुत सारे आवेषण / अद्यतन / धीमा कर देता है। इसलिए यदि आपकी तालिका बहुत बदल जाती है, तो सावधान रहें कि उनमें से बहुत अधिक न बनाएं।
  • स्पेस भी एक समस्या हो सकती है। सिर्फ इसलिए नहीं क्योंकि गीगाबाइट में पैसा खर्च होता है (आजकल बहुत ज्यादा नहीं है), लेकिन बैकअप के बाद से समय भी कम होगा (यह बैकअप कैसे किया जाता है इसके आधार पर)।
  • सबसे गंभीर डेटाबेस को अनुक्रमित करने के लिए मॉनिटर किया जा सकता है जो शायद ही कभी या कभी उपयोग नहीं किया जाता है। उनमें से कुछ को छोड़ने पर विचार करें।
  • कभी-कभी आपको लगता है कि आपको एक इंडेक्स की आवश्यकता है, लेकिन जब आप अपनी क्वेरी को अधिक बारीकी से जांचते हैं तो इसे ट्यून किया जा सकता है और एक ही परिणाम के साथ और इंडेक्स की आवश्यकता के बिना अलग से फिर से लिखा जा सकता है। इंडेक्स का उपयोग किया जाता है या नहीं यह देखने के लिए व्याख्या योजना का उपयोग करें।
  • कभी-कभी अंतिम कॉलम (कॉलम) को बहुत अधिक प्रदर्शन हिट के बिना मल्टी-कॉलम इंडेक्स से गिराया जा सकता है। और कभी-कभी यह और भी तेज़ी से प्रश्न बना सकता है क्योंकि सूचकांक भंडारण स्थान छोटा है और किसी भी समय सूचकांक का अधिक मेमोरी में कैश / होल्ड किया जाएगा।
  • फंक्शन आधारित इंडेक्स सामान्य लोगों को अधिक स्थान बचाने के लिए बदल सकते हैं। उदाहरण: पूर्ण उपनाम के लिए क्वेरी करने के बजाय, पहले दो अक्षरों के लिए क्वेरी भी ( where substr(surname, 1, 2) = substr(<userinput>, 1, 2) and surname=<userinput>) और create index i on customers(substr(surname,1,2))। यह काफी तेज़ हो सकता है और आपका सूचकांक छोटा होगा।
  • डेटाबेस विभिन्न प्रकार के इंडेक्स का समर्थन करता है। कुछ प्रकार दूसरों की तुलना में कम जगह का उपयोग करते हैं। हो सकता है कि आपके कुछ सूचकांक कम जगह लेने वाले प्रकार में परिवर्तित हो सकते हैं? अलग-अलग इंडेक्स प्रकारों को समझना सुनिश्चित करें और वे किन परिस्थितियों के लिए अच्छे और बुरे हैं।
  • यदि एक अनौपचारिक बैच की नौकरी एकमात्र ऐसी चीज है जिसे एक विशिष्ट सूचकांक की आवश्यकता है, तो केवल उस बैच की नौकरी के लिए उस सूचकांक को बनाने पर विचार करें और बाद में इसे छोड़ दें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.