SQL सर्वर 2014 COUNT (DISTINCT x) स्तंभ x के लिए सांख्यिकी घनत्व वेक्टर की उपेक्षा करता है


15

इसके लिए COUNT(DISTINCT)~ 1 बिलियन भिन्न मान हैं, मुझे केवल ~ 3 मिलियन पंक्तियों वाली अनुमानित हैश एग्रीगेट वाली एक क्वेरी योजना मिल रही है।

ये क्यों हो रहा है? SQL सर्वर 2012 एक अच्छा अनुमान पैदा करता है, तो क्या यह SQL Server 2014 में एक बग है जो मुझे कनेक्ट पर रिपोर्ट करना चाहिए?

क्वेरी और खराब अनुमान

-- Actual rows: 1,011,719,166
-- SQL 2012 estimated rows: 1,079,130,000 (106% of actual)
-- SQL 2014 estimated rows: 2,980,240 (0.29% of actual)
SELECT COUNT(DISTINCT factCol5)
FROM BigFactTable
OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE

-- Stats for the factCol5 column show that there are ~1 billion distinct values
-- This is a good estimate, and it appears to be what the SQL 2012 CE uses
DBCC SHOW_STATISTICS (BigFactTable, _WA_Sys_00000005_24927208)
--All density   Average Length  Columns
--9.266754E-10  8               factCol5
SELECT 1 / 9.266754E-10
-- 1079126520.46229

क्वेरी योजना

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

पूरी स्क्रिप्ट

यहाँ केवल डेटाबेस के आँकड़े का उपयोग करके स्थिति का एक पूर्ण पुनर्खरीद है

मैंने अब तक क्या कोशिश की है

मैंने संबंधित कॉलम के लिए आंकड़ों को खोदा और पाया कि घनत्व वेक्टर अनुमानित ~ 1.1 बिलियन भिन्न मान दिखाता है। SQL Server 2012 इस अनुमान का उपयोग करता है और एक अच्छी योजना तैयार करता है। SQL सर्वर 2014, आश्चर्यजनक रूप से, आंकड़ों द्वारा प्रदान किए गए बहुत सटीक अनुमान को अनदेखा करता प्रतीत होता है और इसके बजाय बहुत कम अनुमान का उपयोग करता है। यह एक बहुत धीमी योजना तैयार करता है जो लगभग पर्याप्त मेमोरी को आरक्षित नहीं करता है और टेम्पर्ड बी पर फैलता है।

मैंने ध्वज लगाने की कोशिश की 4199, लेकिन इससे स्थिति ठीक नहीं हुई। अंत में, मैंने ट्रेस झंडे के संयोजन के माध्यम से ऑप्टिमाइज़र जानकारी में खुदाई करने की कोशिश की (3604, 8606, 8607, 8608, 8612), जैसा कि इस लेख के दूसरे भाग में दिखाया गया है । हालाँकि, मैं किसी भी जानकारी को तब तक देखने में सक्षम नहीं था जब तक कि यह अंतिम आउटपुट ट्री में प्रकट न हो जाए।

कनेक्ट समस्या

इस सवाल के जवाब के आधार पर, मैंने इसे कनेक्ट में एक मुद्दे के रूप में भी दर्ज किया है

जवाबों:


14

जिस तरह से कार्डिनैलिटी का अनुमान लगाया गया है, वह निश्चित रूप से मेरे लिए प्रति-सहज लगता है। अलग गणना गणना (विस्तारित घटनाओं या 2363 और 3604 झंडे के साथ देखने योग्य) है:

आँकड़े व्युत्पन्न

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

DBCC SHOW_STATISTICS 
    (BigFactTable, [PK_BigFactTable])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

पीके आँकड़े

3.35544E-07 के Col5 स्तर पर घनत्व वेक्टर के साथ 3,439,431,721 में से 2,980,235 पंक्तियों को दिखाया गया है। इसका पारस्परिक गुण 2,980,240 के वास्तविक गणित का उपयोग करते हुए 2,980,235 के अलग-अलग मान देता है।

अब सवाल यह है कि दिए गए आंकड़ों को देखते हुए, मॉडल को विभिन्न मूल्यों की संख्या के बारे में क्या अनुमान लगाना चाहिए। मैं इसे एक्सट्रापोल करने की उम्मीद करूंगा, लेकिन ऐसा नहीं किया गया है, और शायद जानबूझकर।

अधिक सहजता से, मैं उम्मीद करूंगा कि मल्टी-कॉलम आंकड़ों का उपयोग करने के बजाय, यह Col5 पर घनत्व को देखेगा (लेकिन यह नहीं है):

DBCC SHOW_STATISTICS 
    (BigFactTable, [_WA_Sys_00000005_24927208])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

Col5 आँकड़े

यहाँ घनत्व 9.266754E-10 है, है पारस्परिक जिनमें से +१०७९१२६५२८

इस बीच एक स्पष्ट समाधान बहु-स्तंभ आँकड़ों को पूर्ण स्कैन के साथ अद्यतन करना है। अन्य मूल कार्डिनैलिटी अनुमानक का उपयोग करना है।

आपके द्वारा खोले गए कनेक्ट आइटम, एसक्यूएल 2014 के नमूने ने बहु-स्तंभ आँकड़ों को गैर-अग्रणी स्तंभों के लिए अधिक सटीक एकल-स्तंभ आँकड़ों को ओवरराइड किया , SQL Server 2017 के लिए निश्चित रूप से चिह्नित है ।

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