[SQLServer] Surveiller les statistiques par partition
WITH PartitionStats AS
(
SELECT
ps.object_id,
i.name AS index_name,
s.name AS stat_name,
p.partition_number,
ps.row_count,
ps.row_count * 0.20 + 500 AS seuil_modifications, -- règle classique
ps.row_count * 0.01 + 500 AS seuil_modifications_adaptatif, -- règle adaptative TF2371 (activée par défaut depuis SQL 2016)
ps.row_count AS total_rows_in_partition,
sp.modification_counter
FROM sys.dm_db_partition_stats ps
JOIN sys.indexes i
ON ps.object_id = i.object_id AND ps.index_id = i.index_id
JOIN sys.stats s
ON s.object_id = ps.object_id AND s.name = i.name
JOIN sys.partitions p
ON ps.partition_id = p.partition_id
CROSS APPLY sys.dm_db_stats_properties_internal(s.object_id, s.stats_id) sp
WHERE ps.object_id = OBJECT_ID('dbo.table1')
AND i.name = 'index_1'
)
SELECT
partition_number,
total_rows_in_partition,
modification_counter,
seuil_modifications,
seuil_modifications_adaptatif,
CASE
WHEN modification_counter >= seuil_modifications THEN '⚠️ Seuil classique franchi'
WHEN modification_counter >= seuil_modifications_adaptatif THEN '⚠️ Seuil adaptatif franchi'
ELSE 'OK'
END AS statut
FROM PartitionStats
ORDER BY partition_number;
row_count * 0.20 + 500
→ seuil classique des 20 % + 500.
row_count * 0.01 + 500
→ seuil adaptatif appliqué automatiquement à partir de SQL Server 2016 (TF 2371
)
modification_counter
→ nombre de lignes modifiées depuis la dernière mise à jour de stats
La colonne statut indique si la partition dépasse un seuil.