SQL Server 2014 COUNT (DISTINCT x) ігнорує вектор щільності статистики для стовпця x


15

Для того, 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

Відповіді:


14

Те, як отримано оцінку кардинальності, мені, безумовно, здається протиінтуїтивно зрозумілим. Розрахунок чіткого підрахунку (видно з розширеними подіями або прапорами трасування 2363 та 3604):

Виведення статистики

Помітьте шапку. Загальна логіка цього виглядає дуже розумною (не може бути більше чітких значень), але обмеження застосовується з вибіркової статистики про багато стовпців:

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

PK Статистика

Це показує 2980,235 рядків, відібраних із 3,439,431,721 з вектором щільності на рівні Col5 3,35444E-07. Зворотній зв'язок цього дає ряд чітких значень 2,980,235, округлених за допомогою реальної математики до 2,980,240.

Тепер питання, враховуючи вибіркову статистику, які припущення має робити модель щодо кількості чітких значень. Я б очікував, що це буде екстраполювати, але це не зроблено, а можливо, навмисно.

Більш інтуїтивно, я б очікував, що замість того, щоб використовувати статистику багато стовпців, він буде дивитися на щільність на Col5 (але це не так):

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

Статистика Col5

Тут щільність становить 9,266754E-10, зворотне значення якої 1,079,126,528 .

Одним із очевидних рішень тим часом є оновлення статистики на кілька стовпців із повним скануванням. Інша - використовувати оригінальний оцінювач кардинальності.

Пункт «Підключення», який ви відкрили, вибіркова статистика багато стовпців SQL 2014 замінює більш точну статистику одного стовпця для непровідних стовпців , позначено « Виправлено для SQL Server 2017».

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.