[SQL Server] Mise à jour des statistiques sql

DECLARE @TableName SYSNAME = 'dbo.TaTable';

-- Remplace par ta table

DECLARE @ObjectID INT = OBJECT_ID(@TableName);
DECLARE @StatName SYSNAME, @StatsID INT, @IsIncremental BIT;

-- Curseur sur toutes les stats de la table
DECLARE StatCursor CURSOR FOR
SELECT
s.name,
s.stats_id,
s.is_incremental
FROM sys.stats s
WHERE s.object_id = @ObjectID;

OPEN StatCursor;
FETCH NEXT FROM StatCursor INTO @StatName, @StatsID, @IsIncremental;

WHILE @@FETCH_STATUS = 0
BEGIN
IF @IsIncremental = 1
BEGIN
-- Vérifie s’il y a des partitions modifiées
IF EXISTS (
SELECT 1
FROM sys.dm_db_incremental_stats_properties(@ObjectID, @StatsID)
WHERE modification_counter > 0
)
BEGIN
PRINT ' Mise à jour de la statistique incrémentale : ' + @StatName;
EXEC('UPDATE STATISTICS ' + @TableName + ' [' + @StatName + '] WITH RESAMPLE, INCREMENTAL = ON');
END
END
ELSE
BEGIN
-- Vérifie si la stat non incrémentale est obsolète
IF EXISTS (
SELECT 1
FROM sys.dm_db_stats_properties(@ObjectID, @StatsID)
WHERE modification_counter > 0
)
BEGIN
PRINT ' Mise à jour de la statistique NON incrémentale : ' + @StatName;
EXEC('UPDATE STATISTICS ' + @TableName + ' [' + @StatName + '] WITH RESAMPLE');
END
END

FETCH NEXT FROM StatCursor INTO @StatName, @StatsID, @IsIncremental;
END

CLOSE StatCursor;
DEALLOCATE StatCursor;