Для того, COUNT(DISTINCT)
що має ~ 1 мільярд чітких значень, я отримую план запитів із хеш-сукупністю, за оцінками, лише ~ 3 мільйони рядків.
Чому це відбувається? SQL Server 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 Server 2014, начебто, ігнорує дуже точну оцінку, надану статистикою, і натомість використовує набагато нижчу оцінку. Це створює набагато повільніший план, який не зберігає майже достатньо пам’яті і розливається до tempdb.
Я спробував простежити прапор 4199
, але це не виправило ситуації. Нарешті, я спробував зануритися в інформацію оптимізатора за допомогою комбінації прапорів слідів (3604, 8606, 8607, 8608, 8612)
, як це було показано у другій половині цієї статті . Однак мені не вдалося побачити будь-яку інформацію, що пояснювала б погану оцінку, поки вона не з’явилася у кінцевому дереві вихідних даних.
Проблема з підключенням
На основі відповідей на це питання я також подав це як проблему в Connect