文章出處

1、文件分配方式以及文件空間檢查方法

最常用的檢查數據文件和表大小的命令就是:sp_spaceused

此命令有三個缺陷:1、無法直觀的看出每個數據文件和日志文件的使用情況。2、這個存儲過程依賴SQL Server存儲在一些系統視圖里的空間使用統計信息計算出的結果,如果沒有更新空間統計信息,比如剛剛發生大數據插入,sp_spaceused的結果就不準確。3、這個命令主要是針對普通用戶的數據庫,對于tempdb數據庫里存儲的一些系統臨時數據對象,是無法用這個存儲過程來統計的。

可以通過“sp_helptext sp_spaceused”命令查看該存儲過程明細。

SQL Server的文件分為數據文件(.mdf,.ndf)和日志文件(.ldf)兩種。不同的文件查看方式不同。

數據內容以頁形式存儲,可以通過DBCC PAGE命令查看頁內容

DBCC PAGE(<db_id>,<file_id>,<page_id>,<forma_id>)

比如我們要看AdventureWorks這個數據庫里面的AdventureWorks_Data數據文件里的第3230頁。我們先從db_id可以從sp_helpdb的結果中得到;file_id可以從sp_helpfile的結果中得到。

Format_id是指定的輸出格式,有1、2、3三個值。一般來講,3這個輸出格式比較直觀。在運行DBCC PAGE之前,還需要打開跟蹤標識(trace flag)3604.

我們來查看明細:

 這里有幾個信息比較重要,比如ObjectID=133575514、IndexId=1

它告訴我們,這個頁面屬于133575514這個對象,ID為1的索引(index)。通過下列語句可以得到它屬于什么對象。

select s.name,o.name
from sys.sysobjects o 
inner join sys.schemas s
on o.uid=s.schema_id
where o.id=133575514
go
select id,indid,name
from sys.sysindexes
where id=133575514 and  indid=1
go exec sp_helpindex N'DimProduct' go

我們可以看到此頁面屬于DimProduct表、然后這個表下面的索引:PK_DimProduct_ProductKey,這個索引建立在ProductKey列上

可以通過下面的命令來查看數據庫中某張表有那些區,該區中第一個頁面的ID是多少:

上面的這張表用到了這么多區的內容,并且每個區中大部分存儲為8個的連續頁,只有第一個為1個頁,頁面的ID為217。

大型行的支持

在SQL Server中,行不能跨頁,屬于同一行的所有字段的數據都要放在同一個頁面里,頁的最大數據量是8064B(8KB)。所以一般數據類型字段所組成的一行,最長加起來不能超過8KB,但這個限制不包括varchar(max)、nvarchar(max)、varbinary(max)這樣的數據類型,在2005以后版本中這種大類型數據字段突破了8KB的限制,方便了用戶的使用,如果不超過8KB,數據還是會一起存放在普通數據頁里面。如果總長度超過了8KB,SQL Server就會把這些字段分開,單獨存放在一種叫做Row-Overflow(行溢出)的頁面里。

數據文件空間使用的計算方法

 查看數據庫使用的最簡單的方法,就是在Management Studio中,右鍵點擊數據庫名稱,選擇報表項中的標準報表進行查看:

這里的統計結果和sp_spaceused統計的結果稍有不同,原因是這里是按照區統計的,由于每個區里面就有8個頁,而這8個頁不一定全部被使用到了,但是如果按照區統計默認的就是全部被使用了,而按照頁統計的結果就不一樣了。

兩種統計方法不同,使用場景也不一樣,按照區統計結果速度快

按照區統計:

如果按照區統計我們使用一個命令就可以實現

DBCC SHOWFILESTATS

由于SQL Server在絕大多數時間都是按照區為單位進行分配新空間的,而系統分配頁上的信息永遠是實時更新的,所以按照這種統計方法比較準確可靠。在服務器負載很高的情況下也能安全執行,不會增加額外的系統負擔。所以要考察數據庫數據文件級的使用情況,它是個比較好的選擇。

按照頁面統計

如果想要知道某個具體的表格或者索引使用了多少空間,就要從頁面級別進行分析。這里我們就可以選擇sp_spaceused或者DBCC SHOWCONTIG

當然在SQL Server2005以后新加了一個sys.dm_db_index_physical_stats來查看索引的存儲明細,包括頁多少,鎖片百分比等

sp_spaceused是根據sys.allocation_units和sys.partitions這兩張管理視圖來計算存儲空間的。當刪除索引后、表的空間信息不實當前信息時,這兩張表可能不能及時反映出數據庫的準確信息。

可以加入Undateusage這個參數,要求SQL Server為這句指令更新管理視圖里的統計信息。這樣做會件消耗資源的工作。在生產壞境下建議不要輕易使用。

sp_spaceused的另一個缺點一次只能查詢一個對象,不能對所有表一次性查找,我們可以通過sys.dm_db_partition_stats視圖來實現這件事情:

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 sys.dm_db_partition_stats p inner join sys.objects o
on p.object_id=o.object_id
group by o.name

sp_spaceused方法簡單,但功能比較脆弱,也不是最準確的方法。不特別推薦使用。

sys.dm_db_partition_stats會來的更直接,對系統性能也沒有多少影響。

DBCC SHOWCONTIG(或者sys.dm_db_index_physical_stats)是檢查數據庫空間分配最準確的方法,它可以展現用了多少頁面、多少區、甚至頁面上的平均數據量。但是也會付出性能上的代價,SQL Server從整體性能角度出發,不可能一直維護這樣的底層統計信息。為了完成這個命令,就必須對庫進行掃描。總之得到的結果越精確,掃描的范圍就越大。

總之:如果管理者只要看數據文件的整體使用情況,DBCC SHOWFILESTATS是比較好的選擇。如果要看每個對象的空間使用情況,可以使用動態管理視圖sys.dm_db_partition_stats。如果想要了解每個頁、每個區的使用情況、碎片程度,那DBCC SHOWCONTIG是比較好的選擇。

日志文件

數據庫的日志文件是包含用于恢復數據庫的所有日志信息。每個數據庫必須至少有一個日志文件,當然也可以有多個。日志文件的推薦文件擴展名是.ldf。與數據庫文件按8KB組織不同,日志文件不是按照頁、區來組織的。

SQL Server數據庫引擎在內部將每一物理日志文件分成多個虛擬日志單元。虛擬日志單元沒有固定大小,且一個物理日志文件所包含的虛擬日志單元數不固定。管理員不能配置或設置虛擬日志單元的大小或數量。但SQL Server會嘗試控制虛擬日志單元的數目,把它限制在一個合理的范圍內,但是有種情況特殊,日志文件每自動增長一次,會至少增加一個虛擬日志單元。所以,如果一個日志文件經歷了多次小的自動增長,里面的虛擬日志單元數目會比正常的日志文件多很多。這種情況會影響到日志文件管理的效率,甚至造成數據庫啟動要花很長時間。

事務日志是一種回繞的文件。例如,假設有一個數據庫,它包含一個分成5個虛擬日志單元的物理日志文件。當創建數據庫時,邏輯日志文件從物理日志文件的始端開始。新日志記錄被添加到邏輯日志的末端,然后向物理日志的末端擴展。

當邏輯日志的末端到達物理日志文件的末端時,新的日志記錄將回繞到物理日志文件的始端,繼續向后寫

查看日志文件的使用情況非常簡單。我們通過下面這個語句查看:

DBCC SQLPERF(LOGSPACE)

上圖顯示了SQL Server上所有數據庫的日志大小,以及使用比率。語句的執行不會對SQL Server帶來負擔,這個語句返回的結果總是正確的。可以隨時在SQL Server上運行這個命令。 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()