IAM (Index Allocation Map) 頁面追蹤 4GB 區間內配置單元使用的區。每個配置單元 = 一組頁面,屬於單一資料表/索引的單一分區,由三類頁面組成:
| 情境 | IAM 頁面數 |
|---|---|
| 單分區、單檔案、<4GB、三類資料皆有 | 3 個 (每類 1 個) |
| 四個分區、三類資料皆有 | 至少 12 個 (4分區 × 3類) |
| 分區跨多檔案 | 每檔案各需一組 IAM |
| 檔案 >4GB 且使用超出區間 | 每 4GB 區間額外一組 IAM |
-- 1. 建立位址轉換函數
CREATE FUNCTION dbo.f_get_page(@page_num BINARY(6))
RETURNS VARCHAR(11)
AS BEGIN
RETURN (CONVERT(VARCHAR(2), (CONVERT(INT, SUBSTRING(@page_num,6,1))*POWER(2,8)) +
(CONVERT(INT, SUBSTRING(@page_num,5,1)))) + ':' +
CONVERT(VARCHAR(11),
(CONVERT(INT, SUBSTRING(@page_num,4,1))*POWER(2,24)) +
(CONVERT(INT, SUBSTRING(@page_num,3,1))*POWER(2,16)) +
(CONVERT(INT, SUBSTRING(@page_num,2,1))*POWER(2,8)) +
(CONVERT(INT, SUBSTRING(@page_num,1,1)))));
END
-- 2. 從系統表建立測試表
SELECT * INTO testIAM FROM master.sys.objects;
-- 3. 查詢配置單元資訊與 IAM 位址
SELECT total_pages, used_pages, data_pages,
first_page, root_page, first_iam_page,
testdb.dbo.f_get_page(first_page) first_page_address,
testdb.dbo.f_get_page(root_page) root_address,
testdb.dbo.f_get_page(first_iam_page) IAM_address
FROM sys.system_internals_allocation_units
WHERE container_id IN (
SELECT partition_id FROM sys.partitions
WHERE object_id IN (SELECT object_id FROM sys.objects WHERE name IN ('testIAM'))
);
-- 4. 使用 DBCC PAGE 檢視 IAM 內容
DBCC PAGE(testdb, 1, 80, 3) -- 檔案1, 頁面80, 輸出選項3
輸出包含:IAM 頁首、配置單元 ID、第一個區位址、8 個頁面指標、位元組映射區域。透過位元組映射可追蹤該配置單元擁有的所有區。