[SQL Server] Divers Requêtes pour gérer les statistiques

--Afficher les dernières mises à jour des statistiques pour les tables Table1 et Table2

SELECT OBJECT_NAME(object_id) AS NomTable, name AS NomIndex,

 STATS_DATE(object_id,index_id) AS DateHeureStats

FROM sys.indexes

WHERE OBJECT_NAME(object_id) IN('Table1','Table2')

 

 

 

--Afficher les dernières mises à jour des statistiques pour les Index idx_index_1 et idx_index_2

SELECT OBJECT_NAME(t1.object_id) AS NomTable,

t1.name AS NomIndex,

 STATS_DATE(t1.object_id,t1.index_id) AS DateHeureStats,

 t2.rowmodctr

FROM sys.indexes t1

inner join sys.sysindexes t2

ON t1.object_id = t2.id and

t1.index_id = t2.indid

WHERE t1.name = 'ix_index_1'

SELECT T2.stats_id, name nomStatistiques, filter_definition, last_updated, rows AS NombreLig, rows_sampled AS LignesEchantillonnees
, steps, unfiltered_rows, modification_counter AS [NombreTotalignesInsereesSupprimEesMisesAjourDepuisDernierUpdateStatistiquesTable]
,T1.*
FROM sys.stats AS T1
CROSS APPLY sys.dm_db_stats_properties(T1.object_id, T1.stats_id) AS T2
WHERE T1.object_id = object_id('MaTable');

SELECT OBJECT_NAME(T1.object_id) AS NomObjet,t3.type_desc,
T1.name AS NomIndex,
STATS_DATE(T1.object_id,T1.index_id) AS DateHeureStats,
T2.rowmodctr AS [NombreTotalignesInsereesSupprimEesMisesAjourDepuisDernierUpdateStatistiquesTable], TypeIndex = CASE WHEN T2.indid=0 then 'Segment de mémoire'
WHEN T2.indid=1 then 'Index cluster'
WHEN T2.indid>1 then 'Index non cluster'
ELSE 'Inconnu' END
FROM sys.indexes T1
join sys.sysindexes T2 ON T1.object_id = T2.id and T1.index_id = T2.indid
join sys.objects t3 ON t3.object_id=T1.object_id and t3.type='U'
where
OBJECT_NAME(T1.object_id) ='MaTable'
order by NomObjet,NomIndex

--Afficher les dernières mises à jour des statistiques

SELECTOBJECT_NAME(T1.object_id)AS NomTable,T1.nameAS NomIndex, T2.last_updated AS last_updated_stats, T2.modification_counter, T2.rowsAS NbreLigTable

FROMsys.indexes T1

CROSSAPPLYsys.dm_db_stats_properties(T1.object_id, T1.index_id) T2

WHEREOBJECT_SCHEMA_NAME(T1.object_id,DB_ID())<>'sys'AND T2.modification_counter > 0

ORDERBY T2.last_updated,NomTable

 

--Vérifier si les statistiques sont activés pour Table1

EXEC sp_autostats'Table1'

 

--Activer les statistiques pour Table1

EXEC sp_autostats'Table1', 'ON'

 

--Désactiver les statistiques pour Table1

EXEC sp_autostats'Table1', 'OFF'

 

--Lancer les statistiques pour toutes les tables de la base de données.

EXEC sp_updatestats'BaseDonnee1'

 

--Recalcul de toutes les statistiques

DECLARE @tTables table (NomTable sysname)

 DECLARE @TableTraitee sysname ,

 @csInstruction nvarchar (max)

 SET NOCOUNT ON

INSERT INTO @tTables

 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

 WHERE table_name is not null and

 table_name not in('tableTest')

ORDER BY TABLE_NAME

WHILE (1=1)

 BEGIN

 set @TableTraitee = null

 SELECT TOP 1 @TableTraitee = NomTable FROM @tTables

IF @TableTraitee is null

 BREAK

 PRINT 'Début de traitement des statistiques de la table ' +

@TableTraitee

 set @csInstruction = 'UPDATE STATISTICS [' + @TableTraitee + '] with

fullscan '

 EXEC SP_EXECUTESQL@csInstruction

DELETE FROM @tTables WHERE NomTable = @TableTraitee

END

-- Réinitialiser les statistiques d'attente pour l'instance de SQL Server

DBCC SQLPERF("sys.dm_os_wait_stats",CLEAR);

-- Réinitialiser les statistiques des verrous pour l'instance de SQL Server

DBCC SQLPERF("sys.dm_os_latch_stats",CLEAR);

-- Afficher l'état des statistiques 

DBCC SHOW_STATISTICS ('MaTable','MaStatistique')