Santé des statistiques : date de mise à jour, nombre de lignes modifiées
SQL ServerMaintenanceCommande
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();Ce que fait la commande
Affiche pour chaque statistique l'heure de la dernière mise à jour, le taux d'échantillonnage, les lignes modifiées depuis la dernière mise à jour et le seuil auquel l'auto update se déclenche (seuil dynamique pour compat 130+).
Quand l'utiliser
Pour les plans avec un grand écart entre lignes estimées et réelles, après un gros chargement de données, ou pour vérifier l'efficacité du job de maintenance des statistiques.
Attention
La formule du seuil s'applique au niveau de compatibilité 130+ (MIN(500 + 20%, SQRT(1000 x rows))) ; les niveaux inférieurs utilisent la règle 20% + 500. Les statistiques jamais mises à jour (tables vides) renvoient NULL. Les colonnes asymétriques avec un sample_pct faible peuvent nécessiter FULLSCAN ou PERSIST_SAMPLE_PERCENT. Requête en lecture seule ; sûre.