資料庫空間管理 學習筆記
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)可以查看日誌檔案的使用情況。
使用者物件
• 使用者定義的表和索引。
• 系統表和索引。
• 全域臨時表和索引。
• 局部臨時表和索引。
• 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_page_count),還是系統物件(internal_object_reserved_page_count)
,還是版本儲存區(version_store_reserved_page_count)。
以上就是資料庫空間管理的內容,更多相關文章請關注PHP中文網(www.php.cn)!