這是一段常在開發專案的時候使用的TSQL,用來檢測目前資料庫的資料表中所佔據的容量大約多少,可以用來評估是否執行壓縮,這是亞當斯一位在南亞工務部的朋友所寫的,小弟覺得某些情境下非常實用,在此借花獻佛跟各位分享。
語法如下:
DECLARE @tblname varchar(50) --資料表名稱(使用者資料表名稱變數)
if exists (select * from dbo.sysobjects
where id = object_id(N'dbo.#tmpStatics')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE #tmpStatics --暫存資料表
CREATE TABLE #tmpStatics ( --建立暫存資料表
name varchar(50) NULL , --資料表名稱
rows varchar(50) NULL , --資料表現有的資料列數
reserved varchar(50) NULL , --資料庫中的物件所配置的空間大小
data varchar(50) NULL , --資料所用的空間大小
index_size varchar(50) NULL , --索引所用的空間大小
unused varchar(50) NULL ) --保留給資料庫中之物件但尚未使用的空間大小
DECLARE cur_TableStatics CURSOR FORWARD_ONLY FOR
SELECT name FROM sysobjects
WHERE xtype='U' ORDER BY name --取得使用者資料表名稱
OPEN cur_TableStatics
FETCH NEXT FROM cur_TableStatics
INTO @tblname
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT #tmpStatics
EXEC sp_spaceused @tblname,@updateusage = N'TRUE' --顯示資料表的相關磁碟空間資訊
FETCH NEXT FROM cur_TableStatics
INTO @tblname
END
CLOSE cur_TableStatics
DEALLOCATE cur_TableStatics
SELECT name,rows,
CONVERT(NUMERIC(18,2),SUBSTRING(reserved,1,LEN(reserved)-2))/1024 AS Reserved, -- MB
CONVERT(NUMERIC(18,2),SUBSTRING(data,1,LEN(data)-2))/1024 AS Data,
CONVERT(NUMERIC(18,2),SUBSTRING(index_size,1,LEN(index_size)-2))/1024 AS Index_Siz,
CONVERT(NUMERIC(18,2),SUBSTRING(unused,1,LEN(unused)-2))/1024 AS Unused
FROM #tmpStatics
WHERE rows <> '0'
ORDER BY Data
DROP TABLE #tmpStatics
以Pubs資料庫為例,執行完成的結果如下: