आंकड़े अद्यतित हैं, लेकिन अनुमान गलत है


12

जब मुझे dbcc show_statistics ('Reports_Documents', PK_Reports_Documents)रिपोर्ट आईडी 18698 के लिए निम्नलिखित परिणाम मिलेंगे:

यहाँ छवि विवरण दर्ज करें

इस प्रश्न के लिए:

SELECT * 
FROM Reports_Documents 
WHERE ReportID = 18698 option (recompile)

मुझे एक क्वेरी योजना मिलती है जो PK_Reports_Documentsउम्मीद के मुताबिक क्लस्टर इंडेक्स सीक बनाती है।

लेकिन मुझे क्या लगता है कि पंक्तियों की अनुमानित संख्या के लिए गलत मूल्य है:

यहाँ छवि विवरण दर्ज करें

के अनुसार इस :

जब नमूना क्वेरी WHERE क्लॉज मान हिस्टोग्राम RANGE_HI_KEY मान के बराबर होती है, तो SQL सर्वर पंक्तियों की संख्या के बराबर निर्धारित करने के लिए हिस्टोग्राम में EQ_ROWS कॉलम का उपयोग करेगा।

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

सब सब में: क्या कोई मुझे समझा सकता है EQ_ROWSकि हिस्टोग्राम से अनुमानित संख्याओं के लिए इस्तेमाल क्यों नहीं किया जा रहा है और गलत अनुमान कहाँ से आता है?

थोड़ी अधिक (संभवतः उपयोगी) जानकारी:

  • ऑटो के आँकड़े जारी हैं और सभी आँकड़े आज तक हैं।
  • जिस तालिका को उद्धृत किया जा रहा है, उसमें लगभग 80 मिलियन पंक्तियाँ हैं।
  • PK_Reports_Documentsपीके ReportID INTऔर से मिलकर एक संयोजन हैDocumentID CHAR(8)

क्वेरी कुल 5 अलग-अलग सांख्यिकी ऑब्जेक्ट लोड करने के लिए लगती है, जिनमें से सभी में ReportIDतालिका से कुछ अन्य कॉलम होते हैं । वे सभी नए सिरे से अपडेट किए गए हैं। RANGE_HI_KEYनीचे दी गई तालिका में हिस्टोग्राम में उच्चतम ऊपरी बाध्य स्तंभ मान है।

+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
|                                  name                                   | stats_id | auto_created | user_created | Leading column Type | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS  | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| PK_Reports_Documents                                                    |        1 |            0 |            0 | Stationary          |        18722 | 0          | 2228,526 |                   0 | 1              |
| _dta_index_Reports_Documents_42_1629248859__K1_K63_K14_K13_K22_K23_72_6 |       62 |            0 |            0 | Stationary          |        18698 | 0          | 2228,526 |                   0 | 1              |
| _dta_stat_1629248859_1_1_59                                             |       76 |            0 |            1 | Stationary          |        18686 | 50,56393   | 1        |                   0 | 13397,04       |
| _dta_stat_1629248859_1_22_14_18_12_6                                    |       95 |            0 |            1 | Stationary          |        18698 | 0          | 2228,526 |                   0 | 1              |
| _dta_stat_1629248859_1_7_14_4_23_62                                     |       96 |            0 |            1 | Stationary          |        18698 | 56,63327   | 21641,5  |                   0 | 14526,44       |
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+

sp_updatestats आँकड़े अद्यतन करने के लिए हर रात चलाने के लिए निर्धारित है।

जवाबों:


10

इसका एक सरल उपाय है:

सभी _dta_...आँकड़ों को गिराएँ और DTA सिफारिशों को आँख बंद करके लागू करें।

अधिक जानकारी

विशेष समस्या यह थी कि प्रश्न में कॉलम के लिए कई सेट आँकड़े थे। अतिरिक्त dtaआँकड़ों का निर्माण आँकड़ों के नमूने के द्वारा किया गया था (आँकड़ों के लिए डिफ़ॉल्ट व्यवहार जो किसी सूचकांक से जुड़ा नहीं है)।

जैसा कि अक्सर नमूना आंकड़ों के साथ होता है, परिणामी हिस्टोग्राम्स ने अप्रतिबंधित डेटा की पूरी श्रृंखला को कवर नहीं किया। प्रश्न में क्वेरी हिस्टोग्राम के बाहर एक मूल्य चुनने के लिए हुई, जिसके परिणामस्वरूप 1-पंक्ति अनुमान था।

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


यह वास्तव में काम करता है। हालाँकि मैंने _dta_आँकड़े नहीं बनाए थे , वे तब से वहाँ थे जब से मुझे डीबी पर अपना पहला नज़रिया मिला। मुझे नहीं पता था कि सिफारिशों का उपयोग करने से ऐसे प्रतिकूल प्रभाव पड़ सकते हैं ...
user1151923
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.