SQL Server 存儲(5/8):索引分配映射(Index Allocation Map:IAM)頁

在SQL Server 2005和以後的版本里,分配單元(allocation units)有以下三個類型:

  • IN_ROW_DATA:用於存儲堆分區或索引分區,即heap和B-tree。

  • LOB_DATA:用於存儲大型對象 (LOB) 數據類型,例如 xml、varbinary(max) 和 varchar(max)。

  • ROW_OVERFLOW_DATA:用於存儲超過 8,060 字節行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中存儲的可變長度數據。 

IAM用來跟蹤表的指定allocation units在分區的GAM裏頁或區的分配情況,IAM頁page type爲10

我們創建一個包含3列varchar(3000)、1列LOB、1列int類型的表,這樣我們的表就包含三類分配單元。

 

USE InternalStorageFormat
GO

CREATE TABLE IAMTable(
Id INT,
col1 VARCHAR(3000),
col2 VARCHAR(3000),
col3 VARCHAR(3000),
Lobdata NTEXT)
GO

往表裏插入數據

INSERT  INTO IAMTable VALUES  ( 1, 'A', 'B', 'C', N'Test' )

這裏我們插入的1條數據不會生成溢出行(row overflow),使用DBCC IND命令列出分配給這個表的頁。

DBCC IND('InternalStorageFormat','IAMTable',1)

SQL Server爲這個表分配了2個IAM頁,用來跟蹤In-row data和LOB data的分配。因爲當前的記錄大小不足以創建ROW_OVERFLOW_DATA,沒有分配一個IAM頁來跟蹤ROW_OVERFLOW_DATA的分配。

我們來插入一條可以讓SQL Serve生成ROW_OVERFLOW_DATA,並用DBCC IND命令查看頁面分配情況。

INSERT  INTO IAMTable VALUES  ( 1, REPLICATE('A',3000), REPLICATE('A',3000), REPLICATE('A',3000), N'Test' );
DBCC IND('InternalStorageFormat','IAMTable',1)

圖1

現在表已經有了3類分配單元,如果我們這表上有更多的分區,那就每個區都有獨立的一系列IAM頁。

簡而言之,堆或B樹結構至少有一個IAM頁,最多有3倍分區個IAM頁。如果表繼續增長,頁分配在不同的GAM區間,會有更多的IAM頁增加。這些IAM頁會鏈接起來,這個列表叫IAM鏈。

現在我們已經知道了IAM頁的用處,讓我們一起看看在IAM頁裏是什麼樣的。從剛纔的圖片我們知道175頁是用來跟蹤in-row data分配單元的IAM頁,我們用DBCC PAGE命令看看頁裏面的信息是什麼。

DBCC TRACEON(3604)
go
DBCC PAGE('InternalStorageFormat',1,175,3)

IAM:Header區域:

  • sequenceNumber = 0          這是IAM頁在IAM鏈中的位置。在IAM鏈中每增加1個IAM頁,這裏會加1。      
  • status = 0x0                       未使用。 
  • objectId = 0                        未使用。
  • indexId = 0                         未使用。
  • page_count = 0                   未使用。
  • start_pg = (1:0)                  這是頁面映射的GAM區間,保存着在映射的GAM區間的第一個頁ID。

Single Page allocation 區域:

表示從混合區分配的第1個8頁。在第8頁後,SQL開始從統一區分配。因此這個部分只用在第一個IAM頁鏈。174和210頁是從混合區分配的,這個和剛纔DBCC IND('InternalStorageFormat','IAMTable',1)輸出結果一致。

Extent Alloc 區域:這裏顯示的是分配單元區分配。

我們執行下列語句,往表裏插入7條記錄,這樣表裏就有9條記錄了,再用DBCC PAGE看下IAM頁的信息。

INSERT  INTO IAMTable
VALUES  ( 1, REPLICATE('A',3000), REPLICATE('A',3000), REPLICATE('A',3000), N'Test' )
go 7

DBCC TRACEON(3604)
go
DBCC PAGE('InternalStorageFormat',1,175,3)

  • 紅色區域:自174,210之後,增加了212,214,215,217, 218,220,共8個頁面,即混合區分配完成。
  • 藍色區域:從224開始分配統一區了。

使用DBCC IND查看下頁面分配情況,完全一致:

DBCC IND('InternalStorageFormat','IAMTable',1)

 

參考

http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/07/sql-server-understanding-the-iam-page/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章