天天看點

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

1、檔案配置設定方式以及檔案空間檢查方法

最常用的檢查資料檔案和表大小的指令就是:sp_spaceused

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

此指令有三個缺陷:1、無法直覺的看出每個資料檔案和日志檔案的使用情況。2、這個存儲過程依賴SQL Server存儲在一些系統視圖裡的空間使用統計資訊計算出的結果,如果沒有更新空間統計資訊,比如剛剛發生大資料插入,sp_spaceused的結果就不準确。3、這個指令主要是針對普通使用者的資料庫,對于tempdb資料庫裡存儲的一些系統臨時資料對象,是無法用這個存儲過程來統計的。

可以通過“sp_helptext sp_spaceused”指令檢視該存儲過程明細。

SQL Server的檔案分為資料檔案(.mdf,.ndf)和日志檔案(.ldf)兩種。不同的檔案檢視方式不同。

資料内容以頁形式存儲,可以通過DBCC PAGE指令檢視頁内容

比如我們要看AdventureWorks這個資料庫裡面的AdventureWorks_Data資料檔案裡的第3230頁。我們先從db_id可以從sp_helpdb的結果中得到;file_id可以從sp_helpfile的結果中得到。

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式
《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

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

我們來檢視明細:

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

 這裡有幾個資訊比較重要,比如ObjectID=133575514、IndexId=1

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

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

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

可以通過下面的指令來檢視資料庫中某張表有那些區,該區中第一個頁面的ID是多少:

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

上面的這張表用到了這麼多區的内容,并且每個區中大部分存儲為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中,右鍵點選資料庫名稱,選擇報表項中的标準報表進行檢視:

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

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

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

按照區統計:

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

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

由于SQL Server在絕大多數時間都是按照區為機關進行配置設定新空間的,而系統配置設定頁上的資訊永遠是實時更新的,是以按照這種統計方法比較準确可靠。在伺服器負載很高的情況下也能安全執行,不會增加額外的系統負擔。是以要考察資料庫資料檔案級的使用情況,它是個比較好的選擇。

按照頁面統計

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

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

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

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

sp_spaceused是根據sys.allocation_units和sys.partitions這兩張管理視圖來計算存儲空間的。當删除索引後、表的空間資訊不實目前資訊時,這兩張表可能不能及時反映出資料庫的準确資訊。

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

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

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

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個虛拟日志單元的實體日志檔案。當建立資料庫時,邏輯日志檔案從實體日志檔案的始端開始。新日志記錄被添加到邏輯日志的末端,然後向實體日志的末端擴充。

當邏輯日志的末端到達實體日志檔案的末端時,新的日志記錄将回繞到實體日志檔案的始端,繼續向後寫

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

檢視日志檔案的使用情況非常簡單。我們通過下面這個語句檢視:

《SQL Server企業級平台管理實踐》讀書筆記——SQL Server資料庫檔案配置設定方式

上圖顯示了SQL Server上所有資料庫的日志大小,以及使用比率。語句的執行不會對SQL Server帶來負擔,這個語句傳回的結果總是正确的。可以随時在SQL Server上運作這個指令。