2008-01-02

顯示每一個資料庫的所使用的磁碟空間之完整版本; Displays the disk space reserved and used by the each database



若是需要顯示 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


請參考以下的執行結果:

沒有留言:

張貼留言