सूचकांक बनाने के बजाय सांख्यिकी बनाने के लिए कब बेहतर है?


38

मुझे बहुत सी जानकारी मिली है कि क्या STATISTICS हैं: उन्हें कैसे बनाए रखा जाता है, कैसे वे मैन्युअल रूप से या स्वचालित रूप से क्वेरी या इंडेक्स से बनाए जा सकते हैं, और इसी तरह। लेकिन, मुझे खोजने में असमर्थ किया गया है किसी भी मार्गदर्शन या के बारे में "सर्वोत्तम प्रथाओं" जानकारी जबउन्हें बनाने के लिए: एक इंडेक्स की तुलना में मैन्युअल रूप से बनाए गए स्टैटिस्टिक्स ऑब्जेक्ट से किन स्थितियों में अधिक लाभ होता है। मैंने मैन्युअल रूप से बनाए गए फ़िल्टर किए गए आँकड़ों को विभाजन तालिका पर प्रश्नों की मदद करते हुए देखा है (क्योंकि अनुक्रमित के लिए बनाए गए आँकड़े पूरी तालिका को कवर करते हैं और विभाजन के अनुसार नहीं हैं - शानदार!), लेकिन निश्चित रूप से ऐसे अन्य परिदृश्य होने चाहिए जो आँकड़ों की वस्तु से लाभान्वित होंगे! सूचकांक के विस्तार की आवश्यकता नहीं है, और न ही सूचकांक को बनाए रखने या अवरुद्ध / मृत-ताले की संभावना को बढ़ाने की लागत के लायक है।

@JonathanFite ने एक टिप्पणी में, अनुक्रमित और आँकड़ों के बीच अंतर का उल्लेख किया:

इंडेक्स SQL ​​को डेटा को तेज़ी से लुकअप्स बनाने में मदद करेगा जो टेबल से अलग तरह से सॉर्ट किए जाते हैं। आँकड़े SQL को यह निर्धारित करने में मदद करते हैं कि क्वेरी को संतुष्ट करने के लिए कितनी मेमोरी / प्रयास की आवश्यकता है।

यह बहुत अच्छी जानकारी है, क्योंकि इससे मुझे अपने प्रश्न को स्पष्ट करने में मदद मिलती है:

यह कैसे पता चलता है (या किसी भी अन्य तकनीकी जानकारी क्या और कैसे व्यवहार और प्रकृति से संबंधित है STATISTICS) यह निर्धारित करने में मदद करता है कि कब चुनना CREATE STATISTICSहै CREATE INDEX, खासकर जब एक इंडेक्स बनाने से संबंधित STATISTICSवस्तु का निर्माण होगा ? केवल STATISTICS जानकारी होने और अनुक्रमणिका होने से क्या परिदृश्य बेहतर होगा ?

यह सुपर-डुपर सहायक होगा, यदि संभव हो, तो एक परिदृश्य का एक कार्यशील उदाहरण है जहां STATISTICSवस्तु ए की तुलना में बेहतर फिट है INDEX


चूंकि मैं एक दृश्य शिक्षार्थी / विचारक हूं, इसलिए मुझे लगा कि बेहतर विकल्प होने पर यह निर्धारित करने में मदद करने के संभावित साधनों के रूप में STATISTICSऔर इसके बीच के अंतरों को देखने में मदद मिल सकती है ।INDEXSTATISTICS

Thingy           PROs                             CONs
-------          ----------                       -------------------
INDEX            * Can help sorts.                * Takes up space.
                 * Contains data (can             * Needs to be maintained (extra I/O).
                   "cover" a query).              * More chances for blocking / dead-locks.

STATISTICS       * Takes up very little space.    * Cannot help sorts.
                 * Lighter maintenance / won't    * Cannot "cover" queries.
                   slow down DML operations.
                 * Does not increase chances
                   of blocking / dead-locks.

निम्नलिखित कुछ संसाधन हैं जो मुझे इसकी तलाश करते हुए मिले, एक यह भी कि यह एक ही प्रश्न पूछता है, लेकिन इसका उत्तर नहीं दिया गया:

एसक्यूएल सर्वर इंडेक्स बनाम स्टेटिस्टिक

SQL सर्वर सांख्यिकी प्रश्न हम पूछने के लिए बहुत शर्मीली थे

सांख्यिकी। क्या बहुरंगी हिस्टोग्राम संभव हैं?

** स्पष्ट होने के लिए, मेरे पास इसके लिए कोई जवाब नहीं है और मैं वास्तव में कुछ लोगों से प्रतिक्रिया प्राप्त करने की तलाश कर रहा हूं, जो यह बताने के लिए कि इंटरव्यू में अजीब तरह से गायब जानकारी प्रतीत होती है।


1
अनुक्रमणिका SQL को डेटा को तेज़ी से लुकअप बनाने में मदद करेगी जो कि तालिका से अलग तरह से हल किए गए हैं। आँकड़े SQL को यह निर्धारित करने में मदद करते हैं कि क्वेरी को संतुष्ट करने के लिए कितनी मेमोरी / प्रयास की आवश्यकता है।
जोनाथन फाइट

@JonathanFite उस टिप्पणी के लिए धन्यवाद। मैंने इसे अपने प्रश्न में शामिल कर लिया है :)।
सोलोमन रटज़की

@ जोनाथनफाइट की टिप्पणी के बाद यह प्रतीत होता है कि आँकड़े तदर्थ प्रणालियों / तालिकाओं / क्वेरी पैटर्न पर प्रदर्शन को बढ़ाने के लिए सर्वोत्तम हैं, जबकि अनुक्रमित पूर्वानुमान योग्य क्वेरी पैटर्न के लिए बेहतर हैं। मेरा मतलब यह है कि एक बयान की तुलना में अधिक सवाल है।
डेव

जवाबों:


19

आप सवाल चारों ओर घूमते हैं - जब केवल आँकड़े बनाने के लिए एक अच्छी बात है बनाम अनुक्रमणिका बनाएँ (जो आँकड़े बनाते हैं)।

मेरे sql सर्वर इंटर्नल नोट्स (SQLSkills वर्ग- IE1 और IE2) और SQL सर्वर इंटर्नल बुक से , नीचे मेरी सीमित समझ है:

SQL सर्वर आँकड़े सिस्टम ऑब्जेक्ट्स के अलावा कुछ भी नहीं हैं जिनमें इंडेक्स कुंजी मान और नियमित कॉलम मान के बारे में महत्वपूर्ण जानकारी होती है।

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

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

आँकड़े के बारे में 2 महत्वपूर्ण बातें हैं:

  1. हिस्टोग्राम केवल बाईं ओर के आँकड़ों (इंडेक्स) कॉलम के डेटा वितरण के बारे में जानकारी संग्रहीत करता है। यह प्रमुख मानों के बहु स्तंभ घनत्व के बारे में जानकारी संग्रहीत करता है। इसलिए अनिवार्य रूप से, हिस्टोग्राम केवल सबसे बाईं ओर के कॉलम के लिए डेटा वितरण को संग्रहीत करता है।

  2. SQL सर्वर तालिका आकार के बावजूद हिस्टोग्राम के अधिकांश 200 चरणों में बनाए रखेगा। प्रत्येक हिस्टोग्राम स्टेप द्वारा कवर किए गए अंतराल में वृद्धि होती है, क्योंकि टेबल बड़े टेबल के लिए "कम सटीक" आंकड़े की ओर जाता है।

    याद रखें कि सूचकांक चयनात्मकता एक मीट्रिक है जो घनत्व के व्युत्क्रमानुपाती है यानी एक स्तंभ में जितने अधिक अद्वितीय मूल्य हैं, उतना ही उच्च उसकी चयनात्मकता है।

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

देखें:

नोट: पॉल व्हाइट या आरोन बर्ट्रेंड जैसे कोई आपके अच्छे प्रश्न को अधिक रंग प्रदान करने के लिए झंकार कर सकता है ।


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

8

मैं कहता हूं कि आपको एक सूचकांक की आवश्यकता होती है जब आपको डेटा की मात्रा को सीमित करने की आवश्यकता होती है / फ़ील्ड (नों) के आधार पर जल्दी से सही डेटा प्राप्त करने की आवश्यकता होती है।

जब आपको सबसे अच्छा संभव तरीके से संचालन करने में सक्षम होने के लिए डेटा की प्रकृति को समझने के लिए ऑप्टिमाइज़र की आवश्यकता होती है, तो आपको आंकड़ों की आवश्यकता होती है।

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


1
नमस्ते वहाँ, और जवाब देने के लिए धन्यवाद। इसलिए, मुझे कब डेटा की प्रकृति को बेहतर ढंग से समझने के लिए ऑप्टिमाइज़र की आवश्यकता होगी / चाहिए, और फिर भी उस डेटा को सीमित नहीं करना चाहिए या इसे तेज़ी से प्राप्त करना चाहते हैं, या इसे क्वेरी को "कवर" करने की आवश्यकता है? आपके फ़िल्टर किए गए इंडेक्स उदाहरण के लिए भी। मुझे वह मिलता है जो आप औसत से किनारे-मामलों को तोड़ने के संदर्भ में कह रहे हैं, लेकिन फ़िल्टर किए गए आँकड़े समान फ़ील्ड पर फ़िल्टर किए गए सूचकांक से बेहतर क्यों होंगे? यह वह अंतर है जिसे मैं पाने की कोशिश कर रहा हूं।
सोलोमन रटज़की

उदाहरण की तरह, आप उपयोगकर्ता नाम पर एक फ़िल्टर किए गए इंडेक्स को पोस्ट टेबल पर नहीं बना सकते क्योंकि यह वहां मौजूद नहीं है। आप इसे यूजर आईडी के आधार पर बना सकते हैं, लेकिन यह उस क्लॉज में नहीं है।
जेम्स ज़ेड

लेकिन UserIDJOIN स्थिति में नहीं होगा , भले ही वह अंदर WHEREक्यों न हो ? और फ़िल्टर किए गए इंडेक्स को लेने के लिए यह काफी अच्छा नहीं होगा?
सोलोमन रटज़की

@srutzky शायद सबसे अधिक वर्तमान संस्करणों में होने की संभावना है, लेकिन सामान्य तौर पर मैं उस पर भरोसा नहीं करूंगा ... ज्यादातर मामलों में, विधेयकों को बिल्कुल मिलान करना होगा। मैं भूल जाता हूं कि उन्होंने यह तय किया है लेकिन एक बिंदु पर एक फ़िल्टर किए गए सूचकांक WHERE BitColumn = 0को एक साधारण क्वेरी के लिए नहीं चुना जाएगा WHERE BitColumn <> 1। (और स्पष्ट होने के लिए, बिट कॉलम अशक्त नहीं था।) मुझे लगता है कि IntColumn > 10मिलान नहीं होने के समान ही मामले थे IntColumn >= 11
हारून बर्ट्रेंड

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

4

इत्जिक बेन-गण द्वारा 70-461 प्रशिक्षण पुस्तक से

मैन्युअल रूप से आंकड़े बनाने के कुछ संभावित कारण हैं। एक उदाहरण है जब एक क्वेरी विधेय में कई कॉलम होते हैं जिसमें क्रॉस-कॉलम संबंध होते हैं; कई कॉलम के आंकड़े क्वेरी प्लान को बेहतर बनाने में मदद कर सकते हैं। कई कॉलमों के आंकड़ों में क्रॉस-कॉलम घनत्व होते हैं जो एकल-स्तंभ आंकड़ों में उपलब्ध नहीं होते हैं। हालाँकि, यदि स्तंभ पहले से ही एक ही अनुक्रमणिका में हैं, तो बहुरंगी आंकड़े ऑब्जेक्ट पहले से मौजूद हैं, इसलिए आपको मैन्युअल रूप से एक अतिरिक्त नहीं बनाना चाहिए।


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

1
मुझे लगता है कि किन की व्याख्या आगे बताएगी कि आप क्या हैं। शायद एक ढेर जो अक्सर डाला जाता है, लेकिन शायद ही कभी विचलित होता है?
केंटारो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.