Автообновление Статистика не обновляет статистику


8

Я использую SQL SERVER 2012мое Auto Update Stats ON в моей базе данных.

Из ссылки ниже я узнал, что статистика автоматического обновления будет срабатывать при каждом SQRT(1000 * Table rows)изменении строк таблицы. https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/

Я создал таблицу с 1000 записей

SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                name
INTO   stst
FROM   sys.objects 

Создание статистики

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Проверка созданной статистики

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

По формуле

select SQRT(1000 * 500) -- 707.106781186548

Так что, если я добавлю / изменим 707.106781186548записи в моей таблице, автоматическое обновление статистики должно сработать

Добавьте 1000больше записей в мою таблицу, которых должно быть более чем достаточно, чтобы выстрелитьauto update stats

INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                a.name
FROM   sys.objects a 

Уволить auto update stats

Select * from stst

Проверка статистики

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

К сожалению , до сих пор Rowsявляется 500только.

Даже после вставки 1000записей в мою таблицу, что явно больше, чем 707.106781186548при выполнении, SELECTпочему статистика автоматического обновления не срабатывает? Что мне здесь не хватает


7
Вы упускаете пару вещей. Улучшенный расчет используется только в версиях до 2016 года, если у вас включен флаг трассировки 2371. Статистика не обновляется при изменении данных, она обновляется после изменения данных, и запрос должен использовать их (при условии, что они достигли порога изменения).
Эрик Дарлинг

7
Также тривиальный запрос (например, SELECT * без предложения WHERE) не будет запускать обновление статистики. Попробуйте выполнить запрос, который на самом деле заставляет движок сделать что-то, где статистика может быть полезна (например, Равенство или диапазон в столбце ведущего ключа).
Аарон Бертран

2
@sp_BlitzErik Спасибо за информацию о Trace Flag, никогда не знаю, что ..
P ரதீப்

3
Не чувствую себя глупо, я узнал кое-что из ответов на ваш вопрос. И я согласен, что @sp_BlitzErik и / или AaronBertrand должны публиковать свои ответы.
SqlZim

8
Я позволю @AaronBertrand опубликовать его как ответ. Он мог использовать очки.
Эрик Дарлинг

Ответы:


11

Новое вычисление используется только в том случае, если включен флаг трассировки 2371, за исключением SQL Server 2016, когда уровень совместимости базы данных контекста установлен на 130, где это поведение по умолчанию. См. Microsoft KB 2754171:

Управление поведением Autostat (AUTO_UPDATE_STATISTICS) в SQL Server

Статистика не обновляется при изменении данных. Обновление статистики запускается, когда оптимизация на основе затрат обнаруживает, что интересная статистика для запроса устарела.

Оптимизатор не вводит оптимизацию на основе затрат для очень простых («тривиальных») запросов, где один очевидный план всегда оптимален. В этом сценарии обновления статистики не происходят.

См. Microsoft White Paper Plan «Кэширование и перекомпиляция в SQL Server 2012 » Грега Лоу.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.