首頁  >  文章  >  資料庫  >  資料庫空間管理

資料庫空間管理

黄舟
黄舟原創
2016-12-15 15:54:23952瀏覽

資料庫空間管理 學習筆記

SQL Server 中資料儲存的基本單位是頁(Page)。磁碟I/O 操作在頁級執行。

SQL Server 讀取或寫入資料的最小單位就是以8 KB 為單位的頁。


每頁的開頭是一個96 B 的頁頭,用於儲存有關頁的系統資訊。包括頁碼、頁類型、頁的可用空間,以及擁有該頁

的物件的分配單元ID。不同類型的數據,儲存在不同類型的頁面。

在正常資料頁上,資料行緊接著頁的標頭依序放置。頁的末尾是行偏移量表,對於頁中的每一行,每個行偏移表都包含一個項目。

每個條目記錄對應行的第一個位元組與頁首的距離。行偏移表中的條目的順序與頁中行的順序相反。

------------------此處插入宋大神的註解----------------------- -

除了頁頭所佔用的空間和行偏移矩陣所佔用的空間,中間剩下的空間就是給資料行使用的。一個資料行中還存在其他的資訊用於表示該行數據,具體的結構是這樣的:狀態位A 1位元組狀態位元B 1位元組定長資料類型的長度2位元組定長資料的內容具體定長資料位元組列數2位元組NULL位元圖列數/8個位元組變長列的個數2位元組變長列的偏移矩陣變長列個數*2個位元組變長列的資料具體變長資料位元組這些最少佔據1+1+2+2+1=7

--------------------------- ----------------------------------------

輸出指定的頁面,可以使用: DBCC PAGE(, , , )

Db_id 可以從sp_helpdb 的結果得到。

File_id 可以從sp_helpfile 的結果得到。

Format_id 是你指定的輸出格式。

在執行DBCC PAGE 之前,還需要開啟追蹤標誌(trace flag)3604


在 SQL Server 中,行不能跨頁,屬於同一行的所有欄位的資料都要放在同一個頁面裡。頁的最大資料量是8 060 B(8 KB)。

所以一般資料型態欄位所組成的一行,最長加起來不能超過8 KB。

但是,此限制不包括Text/Image資料類型欄位的資料。

這些類型欄位的資料會被單獨存放在LOB(LargeObject)頁面裡。


SQL Server 2005 開始的版本中,提供了像varchar(max)、nvarchar(max)、varbinary(max)這樣的資料類型。

如果包含這一類資料類型欄位的行,總長不超過8 KB,資料還是會一起存放在普通資料頁中。

如果總長超過了8 KB,SQL Server 就會把這些欄位的資料分開,單獨存放在一個叫做Row-Overflow(行溢出)的頁面裡。


區(Extent)是8 個實體上連續的頁的集合,用來有效地管理頁。所有頁都儲存在區中。

• 統一區,由單一物件擁有。區中的所有8 頁只能由一個物件使用。

• 混合區,最多可由8 個物件共用。區中8 頁的每頁可由不同的物件所有。但是一頁總是只能屬於一個物件。

通常從混合區向新表或索引分配頁面。當表格或索引成長到8 頁時,將變成使用統一區進行後續分配。


DBCC SHOWFILESTATS

這個命令能直接從GAM 和SGAM 這樣的系統分配頁面上面讀取區分配信息,直接算出數據庫文件裡有多少區已被分配。


sp_spaceused (+ updateusage才會準確)

DBCC SHOWCONTIG(慎用,SQL Server 2005 。

日誌檔案不是按頁/區來組織的。


資料庫引擎在內部將每一實體日誌檔案分成多個虛擬日誌單元。虛擬日誌單元沒有固定大小,

且一個實體日誌檔案所包含的虛擬日誌單元數不固定。

日誌檔案每自動增長一次,會至少增加一個虛擬日誌單元。

如果一個日誌檔案經歷了多次小的自動增長,裡面的虛擬日誌單元數目會比正常的日誌檔案多很多。

這種情況會影響到日誌檔案管理的效率,甚至造成資料庫啟動要花很長時間。

事務日誌是一種迴繞的檔案。當建立資料庫時,邏輯日誌檔案會從實體日誌檔案的起始端開始。


新日誌記錄被加入到邏輯日誌的末端,然後向物理日誌的末端擴張。

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

DBCC SQLPERF(LOGSPACE)可以查看日誌檔案的使用情況。


Tempdb 系統資料庫是全域資源,可供連接到SQL Server 執行個體的所有使用者使用,在SQL Server2005 中,用於保存下列各項:


使用者物件

• 使用者定義的表和索引。

• 系統表和索引。

• 全域臨時表和索引。

• 局部臨時表和索引。

• table 變數。

• 表值函數中傳回的表。


內部物件

• 用於遊標或假脫機操作以及臨時大型物件(LOB)儲存的工作表。

• 用於雜湊連接或雜湊聚合操作的工作檔案。

• 用於建立或重新產生索引等操作(如果指定了SORT_IN_TEMPDB)的中間排序結果,

或某些GROUP BY、ORDER BY 或UNION 查詢的中間排序結果。

每個內部物件至少使用9 頁:一個IAM 頁,一個8 頁的區。


版本儲存區

• 由使用快照隔離等級或已提交讀取隔離等級(基於行版本控制)的資料庫中的資料修改交易產生的行版本。

• 由資料修改交易為實現線上索引操作、多個活動的結果集(MARS)以及AFTER 觸發器等功能而產生的行版本。


Tempdb 空間使用的一大特點,是只有一部分對象,例如使用者建立的臨時表、table 變數等,

可以用sys.allocation_units 和sys.partitions 這樣的管理視圖來管理。

tempdb 的空間使用是不能用sp_spaceused 來追蹤的。 (不準確)


sys.dm_db_file_space_usage這張視圖能反映tempdb 在幾個大類別裡的空間使用分佈。

是使用者物件(user_object_reserved_pa​​ge_count),還是系統物件(internal_object_reserved_pa​​ge_count)

,還是版本儲存區(version_store_reserved_pa​​ge_count)。

以上就是資料庫空間管理的內容,更多相關文章請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn