As part of a Microsoft RAP analysis you might encounter some of the following:
- Databases identified with auto-growth set to percentage growth
- Databases identified with auto-growth set to 1MB growth
- Database files have been identified that have the next Auto Growth increment of 1GB or above
- Databases have been identified with one or more Transaction Log files where expected next Auto Growth increment is 1GB or above
Brent Ozar suggests that the data file and log file autogrowth setting should be 256MB and 128MB respectively, and he makes a good argument here.
Broadly I agree with his position but I also acknowledge, as he does, that every database is different and has its own considerations. (Keep that in mind while reviewing the following script)
I’ve created the script below, which programmatically creates the SQL commands, to apply these recommended values to the autogrowth settings of each database on an instance.
The script gets every database name, and associated data file and log file names and using dynamic SQL writes a script to update autogrowth settings for each database.
You can then adjust the setting values manually for each database before executing.
Or if you’re really brave/crazy execute the dynamic script automatically by changing PRINT @sql to EXEC(@sql).
USE Master; GO SET NOCOUNT ON DECLARE @database AS NVARCHAR(256) ,@dataFileName AS NVARCHAR(256) ,@logFileName AS NVARCHAR(256) ,@sql AS VARCHAR(MAX) ,@loop AS INT ,@end AS INT IF OBJECT_ID('tempdb..#DatabaseList') IS NOT NULL DROP TABLE #DatabaseList CREATE TABLE #DatabaseList ( [#DatabaseListId] INT IDENTITY(1, 1) PRIMARY KEY ,[DatabaseName] [sysname] NOT NULL ,[DataFileName] [sysname] NOT NULL ,[LogFileName] [sysname] NOT NULL ) INSERT INTO #DatabaseList SELECT d.DatabaseName ,d.FileName AS DataFileName ,l.FileName AS LogFileName FROM ( SELECT d.NAME AS DatabaseName ,mf.NAME AS FileName FROM sys.master_files mf(NOLOCK) JOIN sys.databases d(NOLOCK) ON mf.database_id = d.database_id WHERE type_desc = 'ROWS' ) AS d LEFT JOIN ( SELECT d.NAME AS DatabaseName ,mf.NAME AS FileName FROM sys.master_files mf(NOLOCK) JOIN sys.databases d(NOLOCK) ON mf.database_id = d.database_id WHERE mf.type_desc = 'LOG' ) AS l ON l.DatabaseName = d.DatabaseName SET @end = ( SELECT MAX(#DatabaseListId) FROM #DatabaseList ) SET @loop = 1 WHILE @loop <= @end BEGIN SELECT @database = DatabaseName ,@dataFileName = DataFileName ,@logFileName = LogFileName FROM #DatabaseList WHERE #DatabaseListId = @loop --PRINT @database SET @sql = 'USE [' + @database + ']; GO ALTER DATABASE [' + @database + '] MODIFY FILE (NAME=''' + @dataFileName + ''',MAXSIZE = UNLIMITED, FILEGROWTH = 256MB); ALTER DATABASE [' + @database + '] MODIFY FILE (NAME=''' + @logFileName + ''',MAXSIZE = UNLIMITED, FILEGROWTH = 128MB); GO' PRINT @sql SET @loop = @loop + 1 END /* Change PRINT @sql to: EXEC (@sql) To Update the file sizes automatically */
As part of this process I’d also run the script below before and after you’ve made the changes to have a record for change management purposes.
SELECT GETDATE() AS DateOfObservation ,d.NAME AS database_name ,mf.NAME AS file_name ,mf.type_desc AS file_type ,mf.growth AS current_percent_growth FROM sys.master_files mf(NOLOCK) JOIN sys.databases d(NOLOCK) ON mf.database_id = d.database_id