SQL Server
[MSSQL] 14. 데이터 파일 사용률 조회
푸팟퐁쿼리
2023. 4. 20. 21:03
DB별 파일 그룹, 물리적 파일 위치(mdf, ndf, ldf), 파일 크기, 파일 안에서의 실제 사용률, 빈공간 등을 조회할 때 사용할 수 있습니다.
IF OBJECT_ID(N'tempdb..#DB') IS NOT NULL
BEGIN
DROP TABLE #DB
END
CREATE TABLE #DB (name sysname, dbid smallint)
INSERT INTO #DB (name, dbid)
SELECT name, dbid FROM master.dbo.sysdatabases
WHERE name not in ('master', 'msdb', 'model')
GO
DECLARE @dbname sysname
DECLARE @min_dbid smallint
DECLARE @SQL varchar(8000)
IF OBJECT_ID(N'tempdb..#DBSIZE') IS NOT NULL
BEGIN
DROP TABLE #DBSIZE
END
CREATE TABLE #DBSIZE (
database_id INT
, dbname nvarchar(500)
, fileid INT
, filename nvarchar(500)
, type nvarchar(500)
, fg_name nvarchar(500)
, size_mb DECIMAL(10,2)
, used_mb DECIMAL(10,2)
, free_mb DECIMAL(10,2)
, free_pecent DECIMAL(10,2)
, growth nvarchar(500)
, physical_name nvarchar(500)
);
SET @min_dbid = 0
WHILE (@min_dbid IS NOT NULL)
BEGIN
SELECT @min_dbid = MIN(dbid) FROM #DB WHERE dbid > @min_dbid
IF (@min_dbid IS NULL) BREAK
SELECT @dbname = name FROM #DB WHERE dbid = @min_dbid
SET @SQL = 'USE [' + @dbname + '];
SELECT
DB_ID() AS database_id
,DB_NAME() AS dbname
,[fileid] = A.file_id
,[FILE_Name] = A.name
,[TYPE] = A.TYPE_DESC
,[FILEGROUP_NAME] = fg.name
,[FILESIZE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0)
,[USEDSPACE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0 - ((SIZE/128.0) - CAST(FILEPROPERTY(A.NAME, ''SPACEUSED'') AS INT)/128.0))
,[FREESPACE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, ''SPACEUSED'') AS INT)/128.0)
,[FREESPACE_%] = CONVERT(DECIMAL(10,2),((A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, ''SPACEUSED'') AS INT)/128.0)/(A.SIZE/128.0))*100)
,[AutoGrow] = ''By '' + CASE is_percent_growth WHEN 0 THEN CAST(growth/128 AS VARCHAR(10)) + '' MB -''
WHEN 1 THEN CAST(growth AS VARCHAR(10)) + ''% -'' ELSE '''' END
+ CASE max_size WHEN 0 THEN ''DISABLED'' WHEN -1 THEN '' Unrestricted''
ELSE '' Restricted to '' + CAST(max_size/(128*1024) AS VARCHAR(10)) + '' GB'' END
+ CASE is_percent_growth WHEN 1 THEN '' [autogrowth by percent, BAD setting!]'' ELSE '''' END
,[File_Location] = A.PHYSICAL_NAME
FROM sys.database_files A LEFT JOIN sys.filegroups fg ON A.data_space_id = fg.data_space_id
ORDER BY A.file_id
'
INSERT INTO #DBSIZE (database_id, dbname, fileid, filename, type, fg_name, size_mb, used_mb, free_mb, free_pecent, growth, physical_name)
EXEC (@SQL)
UPDATE #DBSIZE SET dbname = @dbname WHERE dbname IS NULL
END
SELECT database_id AS DBID, dbname, fileid, filename, type, fg_name, size_mb, used_mb, free_mb, free_pecent, growth, physical_name
FROM #DBSIZE
ORDER BY database_id, fileid
GO