फिलहाल मैं यह पता लगाने की कोशिश कर रहा हूं कि कैसे 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 पंक्तियाँ।
कृपया मुझे बताएं, इस मामले में कार्डिनलिटी एस्टिमेटर का मूल्यांकन कैसे किया जाता है, शायद मैंने उद्धृत सूत्रों की मेरी समझ में कहीं गलती की है?