Autogrowth ?

 

db-growth

Petit article du jour : Quelles bases de données et qui génèrent des Autogrowth sur la TempDB ?

 

Le contexte : Dans un environnement mutualisé, avec donc plusieurs projets sur une même instance la TempDB grossit tous les jours de 20 Go 100 Go ! Qui en est la cause, quand les Autogrowth ont-ils lieux, combien de temps ont-ils duré …

Je ne rentrerai pas dans les détails de la gestion des logs dans cet article, pour plus d’informations je vous invite à lire le suivant : Gestion des logs SQL Server

 

Une mauvaise gestion de la taille des fichiers entraine une fragmentation, voici une liste non exhaustive de bonnes pratiques :
• Si vous importez des grandes quantités de données qui ont tendance à être de taille fixe sur une base hebdomadaire, augmenter la base de données d’une taille fixe pour tenir compte des nouvelles données.
• Lors de la création de base, initialiser la taille des fichiers
• Gérer de manière proactive la croissance des données et des fichiers journaux
• Éviter l’utilisation des commandes SHRINK

Par défaut, les fichiers de SQL Server (MDF/NDF/LDF) sont initialisés de sorte qu’ils puissent écraser, sur le disque, toutes les données des fichiers précédemment supprimés en « remplissant » leur taille à 0. Lorsque les fichiers sont volumineux les temps d’initialisation peuvent être conséquents. L’initialisation de fichiers de données intervient généralement durant ses différents cas de figure :
• Création d’une base de données
• Ajout de fichiers (ou filegroups) à une base de données
• Augmentation de la taille d’un fichier (i.e., Autogrow)
• Restauration d’une base de données ou d’un groupe de fichiers

Pour accélérer l’initialisation des fichiers, il suffit de configurer correctement les paramètres de sécurité locale du compte de service utilisé par l’instance SQL Server concernée. Pour ce faire, il faut aller dans le SecPol (en tapant « SecPol.msc » dans Démarrage->Exécuter, par exemple) et y ajouter le compte de service SQL Server au sein de l’autorisation « Perform Volume Maintenance Tasks » sous Users Rights Assignements. Cette opération activera ce qu’on appelle l’Instant File.

 

TempDB après un Restart :

SQLServer_AUTOGROWTH

 

Quelques scripts T-SQL

Des informations sur les bases de données :

SELECT
    DB_NAME(database_id) AS db
   ,name
   ,type_desc
   ,physical_name
   ,size
   ,max_size
   ,growth
   ,is_percent_growth
FROM
    sys.master_files
EXEC sp_MSforeachdb @command1 = 'use [?]; EXEC sp_helpfile';
EXEC sp_MSforeachdb @command1 = 'use [?]; EXEC sp_spaceused';

Quelle sera la prochaine taille du fichier après le prochain Autogrowth :

SELECT 
    DB_NAME(files.database_id) AS database_name, 
    files.name logical_name, 
    CONVERT (numeric (15,2) , (convert(numeric, size) * 8192)/1048576) AS [file_size (MB)],
    [next_auto_growth_size (MB)] = CASE is_percent_growth
        WHEN 1 THEN CONVERT(numeric(18,2), (((convert(numeric, size)*growth)/100)*8)/1024)
        WHEN 0 THEN CONVERT(numeric(18,2), (convert(numeric, growth)*8)/1024)
    END,
    is_read_only = CASE is_read_only 
        WHEN 1 THEN 'Yes'
        WHEN 0 THEN 'No'
    END,   
    is_percent_growth = CASE is_percent_growth 
        WHEN 1 THEN 'Yes'
        WHEN 0 THEN 'No'
    END,  
    physical_name
FROM sys.master_files files
WHERE 
    files.type in (0,1)
    AND files.growth != 0

Et voici la plus intéressante des requêtes :

-- Auto Growth History
DECLARE @filename NVARCHAR(1000);
DECLARE @bc INT;
DECLARE @ec INT;
DECLARE @bfn VARCHAR(1000);
DECLARE @efn VARCHAR(10);

-- Get the name of the current default trace
SELECT
    @filename = CAST(value AS NVARCHAR(1000))
FROM
    ::
    FN_TRACE_GETINFO(DEFAULT)
WHERE
    traceid = 1
    AND property = 2;

-- Rip apart file name into pieces
SET @filename = REVERSE(@filename);
SET @bc = CHARINDEX('.', @filename);
SET @ec = CHARINDEX('_', @filename) + 1;
SET @efn = REVERSE(SUBSTRING(@filename, 1, @bc));
SET @bfn = REVERSE(SUBSTRING(@filename, @ec, LEN(@filename)));

-- Set filename without rollover number
SET @filename = @bfn + @efn

-- Process all trace files
SELECT
    ftg.StartTime
   ,te.name AS EventName
   ,DB_NAME(ftg.databaseid) AS DatabaseName
   ,ftg.Filename
   ,( ftg.IntegerData * 8 ) / 1024.0 AS GrowthMB
   ,( ftg.duration / 1000 ) AS DurMS
FROM
    ::
    FN_TRACE_GETTABLE(@filename, DEFAULT) AS ftg
    INNER JOIN sys.trace_events AS te ON ftg.EventClass = te.trace_event_id
WHERE
    ( ftg.EventClass = 92  -- Date File Auto-grow
      OR ftg.EventClass = 93
    ) -- Log File Auto-grow
ORDER BY
    ftg.StartTime

SQL-RESULT

Remarque : Je n’ai pas écrit moi-même ces scripts T-SQL, je ne me rappelle malheureusement plus où je les avais trouvés mais j’espère qu’ils vous serviront ! Au moins je saurais ou les retrouver 😉

 

1 Comment

  • Pour avoir les scripts, tu fais juste un Profiler sur le rapport « Disk Usage » (utilisation du disque en fr-FR) quand tu déroules les agrandissements.

    PS : tes résultats me rappelle vaguement quelque chose 😉

Comments are closed.

En savoir plus sur Pulsweb - Romain Casteres

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Continue reading