SQL सर्वर कंपाउंड कॉलम सांख्यिकी हिस्टोग्राम्स क्यों नहीं करता है?


10

SQL सर्वर में "मल्टी-कॉलम आँकड़े" नामक एक चीज़ होती है, लेकिन ऐसा नहीं है कि कोई भी इसका मतलब होगा।

आइए निम्नलिखित नमूना तालिका पर एक नज़र डालें:

CREATE TABLE BadStatistics 
(
    IsArchived BIT NOT NULL,
    Id INT NOT NULL IDENTITY PRIMARY KEY,
    Mystery VARCHAR(200) NOT NULL
);

CREATE NONCLUSTERED INDEX BadIndex 
    ON BadStatistics (IsArchived, Mystery);

इसके साथ, हमारे पास दो सूचकांक पर दो आँकड़े बनाए जा रहे हैं:

BadIndex के लिए आँकड़े:

+--------------+----------------+-------------------------+
| All density  | Average Length | Columns                 |
+--------------+----------------+-------------------------+
| 0.5          | 1              | IsArchived              |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 37             | IsArchived, Mystery     |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 41             | IsArchived, Mystery, Id |
+--------------+----------------+-------------------------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 0            | 0          | 24398   | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 216602  | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

गुच्छेदार सूचकांक के लिए आँकड़े:

+--------------+----------------+---------+
| All density  | Average Length | Columns |
+--------------+----------------+---------+
| 4.149378E-06 | 4              | Id      |
+--------------+----------------+---------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 240999       | 240997     | 1       | 240997              | 1              |
+--------------+------------+---------+---------------------+----------------+
| 241000       | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

(मैंने यादृच्छिक नमूना डेटा के साथ तालिका को पॉपुलेट किया है, जहां पंक्तियों के दसवें हिस्से के बारे में गैर-संग्रहीत हैं। मैंने बाद में एक पूर्ण स्कैन आँकड़े अपडेट चलाया।)

दो-स्तंभ आँकड़ों का हिस्टोग्राम केवल एक स्तंभ का उपयोग क्यों करता है? मुझे पता है कि कई लोगों ने लिखा है कि यह करता है , लेकिन तर्क क्या है? इस मामले में, यह पूरे हिस्टोग्राम को बहुत कम उपयोगी बनाता है, क्योंकि पहले कॉलम में केवल दो मान होते हैं। सांख्यिकी को मनमाने ढंग से प्रतिबंधित क्यों किया जाएगा?

कृपया ध्यान दें कि यह प्रश्न बहु-आयामी हिस्टोग्राम के संदर्भ में नहीं है, जो कि एक पूरी तरह से अलग जानवर हैं। यह एकल-आयामी हिस्टोग्राम के बारे में है, जिसमें एकल आयाम संबंधित, कई स्तंभों वाले ट्यूपल हैं।

जवाबों:


8

पृष्ठभूमि

वर्तमान SQL सर्वर मॉडल केवल एकल-स्तंभ हिस्टोग्राम और बहु-स्तंभ घनत्व जानकारी का उपयोग करता है। एकल स्तंभ हिस्टोग्राम का उपयोग उपयुक्त विधेयकों जैसे a = 1या के लिए चयनशीलता का अनुमान लगाने के लिए किया जाता है b > 50। एक अनुमानित समग्र चयनात्मकता का उत्पादन करने के लिए कई विधेयकों के साथ एक क्वेरी बस व्यक्तिगत चयन (मान्यताओं के साथ) को जोड़ती है।

एक उदाहरण के लिए, मेरा लेख देखें कार्डिनैलिटी एस्टीमेशन: कॉम्बिनेशन डेंसिटी स्टैटिस्टिक्स

मल्टी-कॉलम घनत्व आगे कई समानता के लिए कमजोर सहसंबंध जानकारी प्रदान करके मॉडल को सूचित करता है और एकत्रीकरण के लिए कार्डिनैलिटी को समूहीकृत करता है।

इंडेक्स के साथ जुड़े आंकड़े उस मॉडल के लिए एक अवसरवादी ऐड-ऑन हैं: इंजन इंडेक्स का निर्माण करते समय (सामान्य रूप से पूर्ण स्कैन) आंकड़े एकत्र कर सकता है। SQL सर्वर स्वचालित रूप से अन्य कुंजी के लिए एक प्रमुख-स्तंभ हिस्टोग्राम और घनत्व जानकारी का निर्माण करता है।

एक सूचकांक में गैर प्रमुख स्तंभों के लिए हिस्टोग्राम क्वेरी प्रोसेसर द्वारा स्वचालित रूप से मांग पर निर्माण किया जा सकता है, या पहले से का उपयोग कर sp_createstatsके साथ @indexonlyविकल्प (दूसरों के बीच)।

मल्टी-कॉलम हिस्टोग्राम

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

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

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

हमें सूचकांक कुंजी के प्रत्येक स्तर (सर्वोत्तम परिणामों के लिए) के लिए एक हिस्टोग्राम की भी आवश्यकता होगी; इस तरह एक सूचकांक के लिए (a, b, c)इसका मतलब होगा हिस्टोग्राम (a, b)और अकेले (a, b, c)पर वर्तमान एकल-स्तंभ हिस्टोग्राम के अलावा (a)

बासी आँकड़ों का पता लगाने के लिए प्रयुक्त तंत्र को प्रभावित बहु-स्तंभ हिस्टोग्राम को बनाए रखने के लिए भी संशोधित करने की आवश्यकता होगी। ये हिस्टोग्राम संभवतः एकल कॉलम आंकड़ों की तुलना में अधिक बार बनाए जाने की संभावना है, क्योंकि अधिक स्तंभों के संशोधन उन्हें प्रभावित करते हैं।

यह सब आकार, जटिलता और रखरखाव को जोड़ता है।

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

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

पाद लेख

इस मामले में, यह पूरे हिस्टोग्राम को बहुत कम उपयोगी बनाता है, क्योंकि पहले कॉलम में केवल दो मान होते हैं

जब आंकड़ों का निर्माण किया गया है, वहाँ 24,398 पंक्तियों जहां थे: हिस्टोग्राम अभी भी प्रमुख स्तंभ में मानों के वितरण के बारे में उपयोगी जानकारी प्रदान करता है IsArchivedथा झूठा है, और 216,602 पंक्तियों कहां है था सच

इसके अलावा, आँकड़े वस्तु हमें बताता है (1 / 0.5) = 2 अलग-अलग मान के लिए देखते हैं IsArchived, (1 / 4.149378E-06) ~ = 241,000 अलग के लिए मान (IsArchived, Mystery)37 बाइट्स के एक औसत पंक्ति आकार के साथ, और वहाँ एक ही आवृत्ति के लिए (IsArchived, Mystery, Id)के साथ प्रति पंक्ति 4 अतिरिक्त बाइट्स।

यह सभी अच्छी सामान्य प्रयोजन वाली जानकारी है, जिसे कई विधेयकों (जैसा कि उल्लेख किया गया है) के साथ प्रश्नों में चयनात्मकता अनुमान लगाने के लिए अन्य स्तंभों के बारे में सांख्यिकीय जानकारी के साथ जोड़ा जा सकता है।

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