DBA遇到 的一個常見問題,就是如何監視數據空間的增長情況,或者在數據庫用滿的時候,能夠迅速定位誰是罪魁禍首。了解一個數據庫空間使用的最簡單方法,就是在 Management Studio里,右鍵點擊數據庫名字,選擇”Reports” – “Standard Reports”,缺省就有4個Disk Usage的報表。它們能很好地統計出了從不同角度分析的數據庫空間使用情況。
但是在一個非常繁忙的生產環境里,隨隨便便地跑UI的報表總是有點頭皮發麻。而且有些詳細的信息,報表上可能沒有。所以許多DBA更喜歡用命令來查詢。SP_Spaceused是個大名鼎鼎的指令。可惜的是,它的結果太籠統,也不精確。作者就從來不用它。
本文將介紹幾個常用的指令,能夠迅速檢查數據空間的使用情況,並比較它們的區別和不同。
SQL Server的數據庫文件分兩種:數據文件,主要是放數據的;日志文件,主要是放置事務紀錄,幫助SQL Server維護事務的一致性。兩類文件都有可能增長到很大。而且在空間耗盡的時候,SQL Server在這個數據庫上的操作都有可能會失敗。所以首先DBA要確定的,是到底哪一類文件使用量不正常。
檢查文件空間的方法不止一種,這里推薦一種又快又准的方法:
同時運行下面兩條命令。
- SQL code
-
Use < 數據庫 > Go dbcc showfilestats go dbcc sqlperf(logspace) go
“dbcc showfilestats”命令會以Extent為單位,統計當前數據庫下所有數據文件里有多少個Extent,其中有多少個被使用過了。一個Extent是64K。乘一下,就能得到每個文件的使用情況。
這 個命令直接從系統分配頁面上面讀取區分配信息,能夠快速准確地計算出一個數據庫數據文件區的總數和已使用過的區的數目,而系統分配頁上的信息永遠是實時更 新的,所以這種統計方法比較准確可靠。在服務器負載很高的情況下也能安全執行,不會增加額外系統負擔。所以看數據庫數據文件級的使用情況,它是個比較好的 選擇。
“dbcc sqlperf(logspace)”命令的輸出非常淺顯易懂。它返回SQL里所有數據庫的日志文件當前使用量。這個命令的輸出也非常快速准確,使用安全。
通 過這兩個命令,你應該能定位是日志文件用得太多,還是數據文件用得太多了吧。日志文件為什么用那么多,是個很熱門的話題。我們的Blog會另有討論。 Tempdb的使用和一般用戶數據庫的使用也不同,我們的Blog也會另有討論。這里我們就只討論用戶數據庫數據文件的使用。
如果發現是數據庫文件用得太多,很自然地,就要去找是哪張表現在長得那么大?下面這個查詢可以很容易地回答你的問題。
- SQL code
-
Use < 數據庫 > Go SELECT o.name , SUM (p.reserved_page_count) as reserved_page_count, SUM (p.used_page_count) as used_page_count, SUM ( CASE WHEN (p.index_id < 2 ) THEN (p.in_row_data_page_count + p.lob_used_page_count + p.row_overflow_used_page_count) ELSE p.lob_used_page_count + p.row_overflow_used_page_count END ) as DataPages, SUM ( CASE WHEN (p.index_id < 2 ) THEN row_count ELSE 0 END ) as rowCounts FROM [ color=#FF0000 ] sys.dm_db_partition_stats [ /color ] p inner join sys.objects o on p. object_id = o. object_id group by o.name go
輸 出結果的第一列是每個表的名字。SQL Server在使用數據頁的時候,為了提高速度,會先把一些頁面一次預留”reserve”給表格,然后真正有數據插入的時候,再使用。所以這里有兩 列,Reserved_page_count和Used_page_count。兩列的結果相差一般不會很多。所以粗略來 講,Reserved_page_count*8K,就是這張表格占用的空間大小。
DataPages是這張表數據本身占有的空間。因此,(Used_page_count – DataPages)就是索引所占有的空間。索引的個數越多,需要的空間也會越多。
RowCounts,是現在這個表里有多少行數據。
通過這些信息,DBA可以掌握數據庫的使用情況。
還 有一個方法可以精確地統計出某張表格的空間使用量,那就是DBCC SHOWCONTIG(或者直接查詢系統管理視圖sys.dm_db_index_physical_stats)。它可以說是最精確的方法,可以告訴你 某張表(或索引)用了多少頁面,多少區,甚至頁面上的平均數據量。從這些值可以算出一張表格占用了多少空間。然而,得到這些精確的數據也是要付出代價的。 SQL Server從整體性能的角度出發,不可能一直維護這樣底層的統計信息。為了完成這個命令,SQL Server必須要對數據庫進行掃描。所以說,這種方式雖然精確,但是在數據庫處於工作高峰時,還是需要避免使用。
總之,一共有五種常見的分析數據文件存儲空間的方法。下面的表格里比較了它們的優缺點和使用特點。
如 果管理者只需要看數據文件的整體使用情況,dbcc showfilestats是比較好的選擇。如果要看每個對象的空間使用情況,可以使用動態管理視圖 sys.dm_db_partition_stats。如果還想了解每個page,每個extent的使用情況、碎片程度,那Dbcc showcontig是比較好的選擇。