Toutes les opérations de croissance ou de réduction des fichiers d’une base sont des opérations conduisant à des dégradation des performances (opérations couteuses, perturbantes, génération de fragmentation physique irréfragable des fichiers…). Il faut absolument éviter que ce genre d’opération se produise de manière implicite ou explicite (commande DBCC SHRINKFILE par exemple, ou encore tâche de réduction des fichiers du plan de maintenance). Voici une requête pour débusquer ces opérations dans l’historique du suivi de diagnostic interne de SQL Server.
Si vous êtes victime d’une telle problématique veillez :
La requête pour ce faire est la suivante :
-- rechercher les événements de croissance des fichiers de toutes les bases DECLARE @FILE_PATH NVARCHAR(1024), @SQL NVARCHAR(max), @CMDSHELL BIT, @SHOW_ADV_OPTIONS BIT; SELECT @FILE_PATH = LEFT(path, LEN(path) - CHARINDEX('\', REVERSE(path)) + 1) FROM sys.traces WHERE is_default = 1; SELECT @SHOW_ADV_OPTIONS = CAST(value_in_use AS BIT) FROM sys.configurations WHERE name = 'show advanced options'; IF @SHOW_ADV_OPTIONS = 0 BEGIN EXEC ('EXEC sp_configure ''show advanced options'', 1;') EXEC ('RECONFIGURE;') END; SELECT @CMDSHELL = CAST(value_in_use AS BIT) FROM sys.configurations WHERE name = 'xp_cmdshell'; IF @CMDSHELL = 0 BEGIN EXEC ('EXEC sp_configure ''xp_cmdshell'', 1;') EXEC ('RECONFIGURE;') END; EXEC sp_configure 'xp_cmdshell', 1; SET @SQL = N'xp_cmdshell ''DIR /B "' + @FILE_PATH + N'*.trc"'''; DECLARE @T TABLE (K INT IDENTITY, L NVARCHAR(1024)); INSERT INTO @T EXEC (@SQL); IF @CMDSHELL = 0 BEGIN EXEC ('EXEC sp_configure ''xp_cmdshell'', 0;') EXEC ('RECONFIGURE;') END IF @SHOW_ADV_OPTIONS = 0 BEGIN EXEC ('EXEC sp_configure ''show advanced options'', 0;') EXEC ('RECONFIGURE;') END DELETE FROM @T WHERE L IS NULL; WITH TRC AS (SELECT L FROM @T) SELECT E.name AS EventName, T.DatabaseName, T.FileName, MF.type_desc AS FileType, T.StartTime, T.EndTime, T.Duration / 1000.0 AS Duration_ms, CAST(SUM(T.Duration) OVER(PARTITION BY DatabaseID) / 1000.0 AS DECIMAL(16,2)) AS DB_Duration_ms, DATEDIFF(millisecond, MIN(T.StartTime) OVER(PARTITION BY T.DatabaseName), MAX(T.EndTime) OVER(PARTITION BY T.DatabaseName)) / 86400000.0 AS PERIODE_JOUR FROM TRC CROSS APPLY sys.fn_trace_gettable(@FILE_PATH + L, NULL) AS T JOIN sys.trace_events AS E ON T.EventClass = E.trace_event_id JOIN sys.master_files AS MF ON T.DatabaseID = MF.database_id AND T.FileName = MF.name WHERE E.name LIKE '%File Auto%' ORDER BY T.DatabaseName, T.StartTime DESC;
Comme a son habitude WordPress, malgré tous les pluggins de la terre étant incapable de ne pas bousiller le code posté dans le présent article, voici un fichier contenant le code à exécuter pour connaître les opérations de croissance de vos fichiers…
rechercher les événements de croissance et réduction des fichiers de toutes les bases SQL Server, le fichier SQL
par exemple, sur un serveur, le lancement de ce code donne :
Vos commentaires sont les bienvenus !
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
* Le site sur les SGBD relationnels et le SQL : https://sqlpro.developpez.com *
* le blog SQL, SQL Server, SGBDR... sur : https://blog.developpez.com/sqlpro/ *
* Expert Microsoft SQL Server, MVP (Most valuable Professional) depuis 14 ans *
* Entreprise SQL SPOT : modélisation, conseil, audit, optimisation, formation *
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *