2008-12-08 67 views
0

我試圖以編程方式監視SQL Server數據庫的大小,以便我的Web應用程序的管理部分可以報告它,並且我可以使用它來執行一些清理SP,以清除日誌文件等SQL Server - 數據庫大小計算差異問題

我用下面的代碼來計算表的大小,每個SO推薦:

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18))EXEC sp_msforeachtable 'INSERT INTO #t EXEC sp_spaceused ''?'''-- SELECT * FROM #t ORDER BY name-- SELECT name, CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)) FROM #t ORDER BY nameSELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3))) FROM 
#tDROP TABLE #t 

當我跑這對我的小樣本數據庫,我得到一個總和值〜6.8兆字節。當我查看我的數據庫的屬性時,它顯示15.5兆字節。

我有以下問題:
1.還有什麼可以彌補差異?
2.可以將這種差異描述爲「開銷」,它只會隨着其他數據的增長而增長(粗略估計就是我所需要的)。
3.存儲過程,函數,視圖,觸發器是在這個「開銷」空間嗎?有沒有辦法來計算這些?
4.是否有另一種方法來獲得整個數據庫的大小?我真的只想要一個簡單的方法來獲得真正的大小。

回答

3

我認爲這種差異是由於您在「屬性」頁面中看到的大小是通過查詢表.sys.database_files來計算的,該表對每個數據庫文件分配的8KB頁面數進行計數。

要獲得同樣的結果,只需運行下面的查詢(SQL Server 2005中):

 
SELECT 
    SUM([size] * 8)/1024 AS DB_Size -- Field "size" contains the number of 8 KB pages contained in each file 
FROM 
    [db_name_here].sys.database_files 

更多信息MSDN網站關於sys.database_files

希望這會有所幫助。 :)

Diego

1

爲什麼不只是檢查磁盤上的文件(或文件)的大小?假設你知道文件的名稱,你可以通過文件系統檢查它們的大小。

+0

嗯...這是一個好主意! – pearcewg 2008-12-08 15:58:57

0

只是一個簡短的觀察,你的腳本似乎只是將sp_spaceused的數據列加起來,而不是保留列(Reserved = data + index + unused)。另外sp_msforeachtable不包括系統表。

而且從SQL Server聯機叢書註釋sp_spaceused

如果未指定objname表,結果 返回整個數據庫。

而且從書本在同一頁上線

database_size總是比保留+未分配 空間的總和 ,因爲它包含的 日誌文件的大小,但保留和 未分配空間僅考慮數據 頁面。

另一件事你可能需要運行DBCC UPDATEUSAGE來獲得準確的數字。

另請參閱「SQL Server Books Online sp_spaceused (Transact-SQL)"