आंशिक रूप से कवर करने वाली सीमा की अनिश्चितता का अनुमान भविष्यवाणी करता है


13

फिलहाल मैं यह पता लगाने की कोशिश कर रहा हूं कि कैसे SQL सर्वर रेंज की कार्डिनैलिटी का मूल्यांकन करता है जो आंशिक रूप से हिस्टोग्राम कदम को कवर करता है।

इंटरनेट पर, कार्डिनैलिटी-एसेसमेंट-फॉर-एंड-फॉर-इंट्रा-स्टेप-स्टैटिस्टिक्स-वैल्यू मैं एक समान प्रश्न आया था और पॉल व्हाइट ने इसका एक दिलचस्प जवाब दिया।

पॉल के उत्तर के अनुसार, विधेय के लिए कार्डिनैलिटी का आकलन करने के सूत्र> = और> (इस मामले में, मैं केवल कम से कम 120 के कार्डिनैलिटी एस्टीमेट मॉडल में दिलचस्पी रखता हूं) इस प्रकार हैं:

के लिए>:

Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1)))

के लिए = =:

Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1))

मैंने [उत्पादन] पर इन फॉर्मूलों के आवेदन का परीक्षण किया । [ २०१४०१६१४ ’और 201 20140618’ के बीच TransactionDate कॉलम और डेटाटाइम रेंज का उपयोग करके रेंज पर आधारित AdventureWorks2014 डेटाबेस की [TransactionHistory] तालिका ।

इस श्रेणी के हिस्टोग्राम कदम के आंकड़े निम्नानुसार हैं:

हिस्टोग्राम

सूत्र के अनुसार, मैंने निम्नलिखित प्रश्न के लिए कार्डिनैलिटी की गणना की:

SELECT COUNT(1)
FROM [AdventureWorks2014].[Production].[TransactionHistory]
WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000'

गणना निम्नलिखित कोड का उपयोग करके की गई थी:

  DECLARE @predStart DATETIME =  '20140615 00:00:00.000'
  DECLARE @predEnd DATETIME = '20140616 00:00:00.000'

  DECLARE @stepStart DATETIME = '20140614 00:00:00.000'
  DECLARE @stepEnd DATETIME = '20140618 00:00:00.000'

  DECLARE @predRange FLOAT = DATEDIFF(ms, @predStart, @predEnd)
  DECLARE @stepRange FLOAT = DATEDIFF(ms, @stepStart, @stepEnd)

  DECLARE @F FLOAT = @predRange / @stepRange;

  DECLARE @avg_range_rows FLOAT = 100.3333
  DECLARE @distinct_range_rows INT = 3
  DECLARE @EQ_ROWS INT = 0

  SELECT @F AS 'F'

  --for new cardinality estimator

  SELECT @EQ_ROWS + @avg_range_rows * (@F * (@distinct_range_rows - 1) + 1) AS [new_card]

गणना करने के बाद, मुझे निम्नलिखित परिणाम मिले:

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

सूत्र के अनुसार, यह 150.5 निकला, लेकिन ऑप्टिमाइज़र 225.75 पंक्तियों में विधेय का अनुमान लगाता है, और यदि आप विधेय की ऊपरी सीमा को '20140617' में बदलते हैं, तो अनुकूलक केवल 250.833 पंक्तियों का मूल्यांकन करेगा, जबकि हम केवल सूत्र प्राप्त करते हैं 200.6666 पंक्तियाँ।

कृपया मुझे बताएं, इस मामले में कार्डिनलिटी एस्टिमेटर का मूल्यांकन कैसे किया जाता है, शायद मैंने उद्धृत सूत्रों की मेरी समझ में कहीं गलती की है?


Sql सर्वर 2014 12.0.5 SP2
Павел Ковал Sepв

जवाबों:


12

SQL सर्वर विभिन्न स्थितियों में विभिन्न गणनाओं का उपयोग करता है। आपका उदाहरण लिंक किए गए प्रश्नोत्तर से अलग है क्योंकि आपकी सीमा पूरी तरह से एक कदम के भीतर निहित है; यह एक कदम सीमा पार नहीं करता है। यह एक के बजाय दो छोरों के साथ एक अंतराल भी है। लेखन BETWEENके साथ दो अलग-अलग विधेय लेखन रूप में ही है >=और <=

एक सीमा के भीतर, दो सीमाओं के साथ अंतराल

सूत्र अपेक्षित मानों की संख्या के लिए कदम के भीतर रैखिक प्रक्षेप करने के लिए संशोधित किया गया है, और यह दर्शाता है कि दो रेंज एंडपॉइंट अब निर्दिष्ट किए गए हैं (और माना जाता है कि हिस्टोग्राम कदम के भीतर मौजूद हैं) एक के बजाय।

प्रश्न में दिए गए हिस्टोग्राम चरणों का उपयोग करना:

प्रश्न हिस्टोग्राम कदम

क्वेरी के लिए BETWEEN '20140615' AND '20140616', गणना है:

DECLARE
    @Q1 float = CONVERT(float, CONVERT(datetime, '2014-06-15')),
    @Q2 float = CONVERT(float, CONVERT(datetime, '2014-06-16')),
    @K1 float = CONVERT(float, CONVERT(datetime, '2014-06-14')),
    @K2 float = CONVERT(float, CONVERT(datetime, '2014-06-18')),
    @RANGE_ROWS float = 301,
    @DISTINCT_RANGE_ROWS float = 3;

DECLARE
    @S1 float = (@Q1 - @K1) / (@K2 - @K1),
    @S2 float = (@Q2 - @K1) / (@K2 - @K1);

DECLARE
    @F float = @S2 - @S1;

DECLARE
    @AVG_RANGE_ROWS float = @RANGE_ROWS / @DISTINCT_RANGE_ROWS;

SELECT
    @AVG_RANGE_ROWS * ((@F * (@DISTINCT_RANGE_ROWS - 2)) + 2);

... 225.75 दे रहे हैं250.833 का परिणाम देने @Q2से बदल रहा है ।'20140616''20140617'

दोनों परिणाम प्रश्न में दिए गए से मेल खाते हैं।

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