
其次SQL Server還提供了一個更為友好的命令以找到各個類型的頁面分布和它們的所在的文件號和頁號。
DBCC IND({'dbname'|dbid},{'objectname'|objectID},
{nonclustered indid|1|0|-1|-2}[,partition_number])
{'dbname'|dbid}表示數據庫名或者數據庫ID
{'objectname'|objectID}表示對象名或者對象ID
{nonclustered indid|1|0|-1|-2}表示顯示行內數據分頁及指定對象的行內IAM分頁信息
1 :顯示所有分頁的信息,包括IAM分頁,數據分頁,所有存在的LOB分頁和行溢出頁,索引分頁
-1: 顯示所有IAM、數據分頁、及指定對象上全部索引的索引分頁.
-2: 顯示指定對象的所有IAM分頁
nonclustered indid:顯示所有的IAM、數據分頁以及一個索引的索引分頁信息。
{partition_number}->可選,為了與中的DBCC IND命令向前兼容.它指定了一個特定分區號,如果不指定,顯示所有分區的信息。
以下是DBCC IND命令輸出結果的字段描述:
字段名稱 | 字段描述 |
PageFID | 索引文件的ID |
PageFID | 索引文件的ID |
IAMFID | 管理該分頁的IAM分頁所在的文件ID |
IAMFID | 管理該分頁的IAM分頁的ID |
ObjectID | 對象ID |
IndexID | 索引ID,0 代表堆, 1 代表聚集索引, 2-250 代表非聚集索引 |
PartitionNumber | 表或索引所在的分區號碼 |
PartitionID | 包含該分頁的分區ID |
iam_chain_type | 該頁所屬分配單元類型;行內數據、行溢出數據或Lob數據 |
PageType | 分頁類型:1數據頁面;2索引頁面;3Lob_mixed_page;4Lob_tree_page;10IAM頁面 |
IndexLevel | 索引層級,0 代表葉級別分頁 ;>0 代表非葉級別層次; NULL 代表IAM分頁 |
NextPageFID | 本層下一個分頁所在的文件ID |
NextPageFID | 本層下一個分頁ID |
PrevPageFID | 本層上一個分頁所在的文件ID |
PrevPageFID | 本層上一個分頁ID |
繼續為了簡化的目的,同時因為模擬的是小型數據表,所以可以忽略相關文件號和iam鏈類型、分區號(該表暫無行內遷移和lob字段),我們只需要看看各 個數據頁之間是否有相互聯系、各個頁面的類型即可;所以我們構建了一張數據表用以存放dbcc ind命令輸出的結果,并有選擇性的選擇我們想要的字段。
CREATE TABLE tablepage
(
PageFID TINYINT,
PagePID INT,
IAMFID TINYINT,
IAMPID INT,
ObjectID INT,
IndexID TINYINT,
PartitionNumber TINYINT,
PartitionID BIGINT,
iam_chain_type VARCHAR(30),
PageType TINYINT,
IndexLevel TINYINT,
NextPageFID TINYINT,
NextPagePID INT,
PrevPageFID TINYINT,
PrevPagePID INT
);
GO
TRUNCATE TABLE tablepage;
INSERT INTO tablepage EXEC ('DBCC IND(testdb,testheap,1)');
SELECT
PagePID,IAMPID,ObjectID,IndexID,Pagetype,IndexLevel,
NextPagePID,PrevPagePID
FROM tablepage
最終結果如下:
我們可以看到SQL Server為該表所使用的頁面地址,索引ID、頁面類型、索引級別、前后頁的關系等等。
Pagetype=10為IAM頁面,Pagetype=1為數據頁面,即17個數據頁面,1個IAM頁面,與 system_internals_allocation_units輸出結果一致,每一個數據頁面都對應該IAM頁面地址,indexid=0表示為堆 表,indexlevel=null表示為IAM頁面,indexlevel=0表示為葉子節點;而讓我們感到有些失望的是每一個頁面似乎除了有共同的 IAM管理頁面之外,相互之間是缺乏聯系的!