Get Database File Growth

Applicability:

SQL Server 2000: Tested

SQL Server 2005: Tested

SQL Server 2008: Tested

SQL Server 2008R2: Tested

SQL Server 2012: Not Tested

Credits:

Author: Nicholas Williams

Date: 3 Feb 2008

Description

Calculates Growth Info for all databases on a server that are being backed up. Extracts file sizes from the backup history in the msdb backup tables, and as a result will only contain growth data for databases that are being backed up. If a database is not being backup up the results will be NULL. (For example the Tempdb).

The growth figures produced here do not reflect any autogrowth events.

Code

SET NOCOUNT ON

/*

Author: Nicholas Williams

Date: 3rd February 2008

Desc: Calculates Growth Info for all databases on a server that are being backed up. Relies on the backup tables, and as a result will only contain as many

days history as do the backup tables(@iNoSamples). If a database is not being backup up the results will be NULL. (For example the Tempdb)

This is a rewrite of something I did a few years ago, as I dont know where I saved the other code. bummer.

Email: Nicholas.Williams@reagola.com

Tested On:

SQL 2000

SQL 2005

SQL 2008

SQL 2008R2

*/

CREATE TABLE ##tbl_DataSize

(

Size DECIMAL(20)

)

CREATE TABLE #tbl_GrowthData

(

DatabaseName VARCHAR(50)

,NoSampleDays DECIMAL(20,3)

,DataSizeMB DECIMAL(20,3)

,LogSizeMB DECIMAL(20,3)

,BackupSizeMB DECIMAL(20,3)

,TotalSpaceMB DECIMAL(20,3)

,DataGrowth DECIMAL(20,3)

,LogGrowth DECIMAL(20,3)

,GrowthPercentage DECIMAL(20,3)

)

DECLARE

@iNoSamples INT

,@nMaxBackupSize DECIMAL

,@nMinBackupSize DECIMAL

,@nMaxLogSize DECIMAL

,@nMinLogSize DECIMAL

,@nMaxDataSize DECIMAL

,@nMinDataSize DECIMAL

,@vcDatabaseName VARCHAR(50)

,@dtMaxBackupTime DATETIME

,@dtMinBackupTime DATETIME

,@iMinBackupID INT

,@iMaxBackupID INT

DECLARE file_cursor CURSOR FOR

SELECT [name] FROM master.dbo.sysdatabases

ORDER BY [name]

OPEN file_cursor

FETCH NEXT FROM file_cursor

INTO @vcDatabaseName

WHILE @@FETCH_STATUS = 0

BEGIN

SET @dtMaxBackupTime =

(

SELECT MAX(backup_finish_date)

FROM msdb.dbo.backupset

WHERE database_name = @vcDatabaseName

AND [type] = 'D'

)

SET @dtMinBackupTime =

(

SELECT MIN(backup_finish_date)

FROM msdb.dbo.backupset

WHERE database_name = @vcDatabaseName

AND [type] = 'D'

)

SET @iNoSamples =

DATEDIFF

(

dd

,@dtMinBackupTime

,@dtMaxBackupTime

)

SET @nMaxBackupSize =

(

SELECT backup_size

FROM msdb.dbo.backupset

WHERE database_name = @vcDatabaseName

AND [type] = 'D'

AND backup_finish_date = @dtMaxBackupTime

)

SET @nMinBackupSize =

(

SELECT backup_size

FROM msdb.dbo.backupset

WHERE database_name = @vcDatabaseName

AND [type] = 'D'

AND backup_finish_date = @dtMinBackupTime

)

SET @iMaxBackupID =

(

SELECT MAX(backup_set_id)

FROM msdb.dbo.backupset

WHERE database_name = @vcDatabaseName

AND [type] = 'D'

AND backup_finish_date = @dtMaxBackupTime

)

SET @iMinBackupID =

(

SELECT MAX(backup_set_id)

FROM msdb.dbo.backupset

WHERE database_name = @vcDatabaseName

AND [type] = 'D'

AND backup_finish_date = @dtMinBackupTime

)

SET @nMaxLogSize =

(

SELECT ((CAST((SUM(file_size)) AS DECIMAL(20,3))) / 1048576)

FROM msdb.dbo.backupfile

WHERE backup_set_id = @iMaxBackupID

AND file_type = 'L'

)

SET @nMinLogSize =

(

SELECT ((CAST((SUM(file_size)) AS DECIMAL(20,3))) / 1048576)

FROM msdb.dbo.backupfile

WHERE backup_set_id = @iMinBackupID

AND file_type = 'L'

)

SET @nMaxDataSize =

(

SELECT ((CAST((SUM(file_size)) AS DECIMAL(20,3))) / 1048576)

FROM msdb.dbo.backupfile

WHERE backup_set_id = @iMaxBackupID

AND file_type = 'D'

)

SET @nMinDataSize =

(

SELECT ((CAST((SUM(file_size)) AS DECIMAL(20,3))) / 1048576)

FROM msdb.dbo.backupfile

WHERE backup_set_id = @iMinBackupID

AND file_type = 'D'

)

EXEC ('INSERT INTO ##tbl_DataSize

SELECT CAST((SUM(size)) as DECIMAL(20,3)) FROM '+@vcDatabaseName+'.dbo.sysfiles')

INSERT INTO #tbl_GrowthData

SELECT

@vcDatabaseName DatabaseName

,@iNoSamples NoSampleDays

,@nMaxDataSize

,@nMaxLogSize

,@nMaxBackupSize / 1048576

,((size * 8192) / 1048576) TotalSpaceUsed

,@nMaxDataSize - @nMinDataSize

,@nMaxLoggSize - @nMinLogSize

,(((@nMaxDataSize + @nMaxLogSize) - (@nMinDataSize+ @nMinLogSize)) / (@nMinDataSize+ @nMinLogSize)) * 100.00

--growth percentage is calculated based upon the original data size, before the growth.

--as a result it may look a little funny, but it is accurate. or at least I think so :)

FROM ##tbl_DataSize

TRUNCATE TABLE ##tbl_DataSize

FETCH NEXT FROM file_cursor

INTO @vcDatabaseName

END

CLOSE file_cursor

DEALLOCATE file_cursor

SELECT *

FROM #tbl_GrowthData

DROP TABLE ##tbl_DataSize

DROP TABLE #tbl_GrowthData

SET NOCOUNT OFF