इसके लिए 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)
, जैसा कि इस लेख के दूसरे भाग में दिखाया गया है । हालाँकि, मैं किसी भी जानकारी को तब तक देखने में सक्षम नहीं था जब तक कि यह अंतिम आउटपुट ट्री में प्रकट न हो जाए।
कनेक्ट समस्या
इस सवाल के जवाब के आधार पर, मैंने इसे कनेक्ट में एक मुद्दे के रूप में भी दर्ज किया है