1+ /*
2+ Author: BradC
3+ Original link: https://dba.stackexchange.com/questions/7917/how-to-determine-used-free-space-within-sql-database-files
4+ Desctiption: Determine used/free space within SQL database files
5+ */
6+
7+
8+ -- This one works for me and seems to be consistent on SQL 2000 to SQL Server 2012 CTP3:
9+ SELECT RTRIM (name ) AS [Segment Name], groupid AS [Group Id], filename AS [File Name],
10+ CAST (size/ 128 .0 AS DECIMAL (10 ,2 )) AS [Allocated Size in MB],
11+ CAST (FILEPROPERTY (name , ' SpaceUsed' )/ 128 .0 AS DECIMAL (10 ,2 )) AS [Space Used in MB],
12+ CAST ([maxsize]/ 128 .0 AS DECIMAL (10 ,2 )) AS [Max in MB],
13+ CAST ([maxsize]/ 128 .0 - (FILEPROPERTY (name , ' SpaceUsed' )/ 128 .0 ) AS DECIMAL (10 ,2 )) AS [Available Space in MB],
14+ CAST ((CAST (FILEPROPERTY (name , ' SpaceUsed' )/ 128 .0 AS DECIMAL (10 ,2 ))/ CAST ([maxsize]/ 128 .0 AS DECIMAL (10 ,2 )))* 100 AS DECIMAL (10 ,2 )) AS [Percent Used]
15+ FROM sysfiles
16+ ORDER BY groupid DESC
17+
18+
19+ -- An alternative (not compatible with SQL Server 200) that provides more information, suggested by Tri Effendi SS:
20+ USE [database name]
21+ GO
22+ SELECT
23+ [TYPE] = A .TYPE_DESC
24+ ,[FILE_Name] = A .name
25+ ,[FILEGROUP_NAME] = fg .name
26+ ,[File_Location] = A .PHYSICAL_NAME
27+ ,[FILESIZE_MB] = CONVERT (DECIMAL (10 ,2 ),A .SIZE / 128 .0 )
28+ ,[USEDSPACE_MB] = CONVERT (DECIMAL (10 ,2 ),A .SIZE / 128 .0 - ((SIZE/ 128 .0 ) - CAST (FILEPROPERTY (A .NAME , ' SPACEUSED' ) AS INT )/ 128 .0 ))
29+ ,[FREESPACE_MB] = CONVERT (DECIMAL (10 ,2 ),A .SIZE / 128 .0 - CAST (FILEPROPERTY (A .NAME , ' SPACEUSED' ) AS INT )/ 128 .0 )
30+ ,[FREESPACE_%] = CONVERT (DECIMAL (10 ,2 ),((A .SIZE / 128 .0 - CAST (FILEPROPERTY (A .NAME , ' SPACEUSED' ) AS INT )/ 128 .0 )/ (A .SIZE / 128 .0 ))* 100 )
31+ ,[AutoGrow] = ' By ' + CASE is_percent_growth WHEN 0 THEN CAST (growth/ 128 AS VARCHAR (10 )) + ' MB -'
32+ WHEN 1 THEN CAST (growth AS VARCHAR (10 )) + ' % -' ELSE ' ' END
33+ + CASE max_size WHEN 0 THEN ' DISABLED' WHEN - 1 THEN ' Unrestricted'
34+ ELSE ' Restricted to ' + CAST (max_size/ (128 * 1024 ) AS VARCHAR (10 )) + ' GB' END
35+ + CASE is_percent_growth WHEN 1 THEN ' [autogrowth by percent, BAD setting!]' ELSE ' ' END
36+ FROM sys .database_files A LEFT JOIN sys .filegroups fg ON A .data_space_id = fg .data_space_id
37+ order by A .TYPE desc , A .NAME ;
0 commit comments