Состояние статистики: когда обновлялась, сколько строк изменилось
SQL ServerОбслуживаниеКоманда
USE [Musteri];
SELECT OBJECT_SCHEMA_NAME(s.object_id) AS schema_name,
OBJECT_NAME(s.object_id) AS table_name,
s.name AS stats_name,
s.auto_created, s.has_filter, s.no_recompute,
sp.last_updated,
sp.rows, sp.rows_sampled,
CAST(100.0 * sp.rows_sampled / NULLIF(sp.rows, 0) AS DECIMAL(5,1)) AS sample_pct,
sp.modification_counter,
CAST(100.0 * sp.modification_counter / NULLIF(sp.rows, 0) AS DECIMAL(9,1)) AS modified_pct,
CAST(CASE WHEN 500 + 0.20 * sp.rows < SQRT(1000.0 * sp.rows) THEN 500 + 0.20 * sp.rows
ELSE SQRT(1000.0 * sp.rows) END AS BIGINT) AS auto_update_threshold,
sp.persisted_sample_percent
FROM sys.stats s
CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
WHERE OBJECTPROPERTY(s.object_id, 'IsUserTable') = 1
ORDER BY sp.modification_counter DESC;
SELECT name, is_auto_create_stats_on, is_auto_update_stats_on, is_auto_update_stats_async_on
FROM sys.databases
WHERE name = DB_NAME();Что делает
Показывает для каждой статистики время последнего обновления, долю выборки, число строк, изменённых после последнего обновления, и порог срабатывания автообновления (динамический порог для compat 130+).
Когда использовать
Для планов с большим разрывом оценочных и фактических строк, после крупной загрузки данных или при проверке эффективности задания обслуживания статистики.
Внимание
Формула порога действует для уровня совместимости 130+ (MIN(500 + 20%, SQRT(1000 x rows))); на более низких уровнях действует правило 20% + 500. Никогда не обновлявшаяся статистика (пустые таблицы) возвращает NULL. Столбцам с перекосом и низким sample_pct может понадобиться FULLSCAN или PERSIST_SAMPLE_PERCENT. Запрос только на чтение; безопасно.