若是需要顯示 SQL Server 上,每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間等等報表時:
可以參考:
顯示資料庫所使用的磁碟空間、資料實際所使用的空間; Displays the disk space reserved and used by the whole database
檢視全部的資料庫,其交易記錄檔案所使用的空間資訊; Transaction log space usage statistics for all databases
筆者彙整範例如下:
顯示 SQL Server 上,每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間。
USE master CREATE TABLE tDBSize ([DBName] [nchar](128) NULL CONSTRAINT [DF_tDBSize_DBName] DEFAULT (db_name()), Fileid INT, FileGroup INT, TotalExtents INT, UsedExtents INT, Name SYSNAME, FileName NVARCHAR(4000) ) CREATE TABLE tLogSize (DBName sysname, logsize float, used float, status int) -- SET NOCOUNT ON DECLARE @mydb sysname,@mystr nvarchar(4000) DECLARE allDB CURSOR FOR SELECT name FROM master..sysdatabases OPEN allDB FETCH NEXT FROM allDB INTO @mydb WHILE (@@FETCH_STATUS=0) BEGIN SET @mystr='USE ['+ @mydb +'] INSERT master.dbo.tDBSize(Fileid,FileGroup,TotalExtents,UsedExtents,Name,FileName) EXEC (''DBCC showfilestats'')' EXECUTE (@mystr) FETCH NEXT FROM allDB INTO @mydb END CLOSE allDB DEALLOCATE allDB -- INSERT INTO master.dbo.tLogSize EXECUTE ('DBCC SQLPERF(LOGSPACE)') -- 完整呈現資料 SELECT D.DBName N'資料庫', TotalExtents N'資料使用的硬碟空間(MB)', UsedExtents N'資料實際使用(MB)', logsize N'交易記錄檔使用的硬碟空間(MB)', (logsize*used/100) N'交易記錄檔實際使用(MB)' FROM tLogSize L INNER JOIN ( SELECT DBName , SUM(TotalExtents*64.0/1024) N'TotalExtents', SUM(UsedExtents*64.0/1024) N'UsedExtents' FROM tDBSize GROUP BY DBName) D ON L.DBName=D.DBName DROP TABLE [dbo].[tDBSize] DROP TABLE [dbo].[tLogSize]
請參考以下的執行結果:
筆者調整了資料顯示的精確度:精確到小數點第二位
彙整範例如下:
顯示 SQL Server 上,每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間。
-- 查詢每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間。 USE master GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tDBSize]') AND type in (N'U')) DROP TABLE [dbo].[tDBSize] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tLogSize]') AND type in (N'U')) DROP TABLE [dbo].[tLogSize] GO CREATE TABLE tDBSize ([DBName] [nchar](128) NULL DEFAULT (db_name()), Fileid INT, FileGroup INT, TotalExtents INT, UsedExtents INT, Name SYSNAME, FileName NVARCHAR(4000) ) GO CREATE TABLE tLogSize (DBName sysname, logsize float, used float, status int) GO -- SET NOCOUNT ON DECLARE @mydb sysname,@mystr nvarchar(4000) DECLARE allDB CURSOR FOR SELECT name FROM master..sysdatabases OPEN allDB FETCH NEXT FROM allDB INTO @mydb WHILE (@@FETCH_STATUS=0) BEGIN SET @mystr='USE ['+ @mydb +'] INSERT master.dbo.tDBSize(Fileid,FileGroup,TotalExtents,UsedExtents,Name,FileName) EXEC (''DBCC showfilestats'')' EXECUTE (@mystr) FETCH NEXT FROM allDB INTO @mydb END CLOSE allDB DEALLOCATE allDB -- INSERT INTO master.dbo.tLogSize EXECUTE ('DBCC SQLPERF(LOGSPACE)') -- 精確到小數點第二位 SELECT D.DBName N'資料庫', CAST(TotalExtents AS decimal(18,2)) N'資料使用硬碟空間(MB)', CAST(UsedExtents AS decimal(18,2)) N'資料實際使用(MB)', CAST(logsize AS decimal(18,2)) '交易記錄檔使用硬碟空間(MB)', CAST((logsize*used/100) AS decimal(18,2)) '交易記錄檔實際使用(MB)' FROM tLogSize L INNER JOIN ( SELECT DBName , SUM(TotalExtents*64.0/1024) N'TotalExtents', SUM(UsedExtents*64.0/1024) N'UsedExtents' FROM tDBSize GROUP BY DBName) D ON L.DBName=D.DBName IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tDBSize]') AND type in (N'U')) DROP TABLE [dbo].[tDBSize] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tLogSize]') AND type in (N'U')) DROP TABLE [dbo].[tLogSize] GO
請參考以下的執行結果:
沒有留言:
張貼留言