首页 > 数据库技术 > 详细

使用 DBCC IND 查看BTree 和 Heap结构

时间:2016-01-17 18:55:25      阅读:505      评论:0      收藏:0      [点我收藏+]

Table 有两种结构:BTree 和 Heap,一个table的结构必定是其中之一。如果在表上创建clustered index,那么表的结构是BTree;如果表上没有创建Clustered index,那么表的结构是Heap。Heap 可以看作一种特殊的Index结构,Index ID 是0,只有一层,Leaf Level,或Data level。BTree 的Clustered Index的ID 是1, Leaf Level是Table的Data Page。

Index pages fall into three basic types: leaf level for nonclustered indexes, nonleaf level for clustered indexes, and nonleaf level for nonclustered indexes. There isn‘t really a separate structure for leaf level pages of a clustered index because those are the data pages.

 

一,DBCC IND命令

DBCC IND ( { dbname | dbid }, { objectname | objectid },{ nonclustered indexid | 1 | 0 | } [, partition_number] )

DBCC IND输出字段描述

Column Meaning
PageFID 索引所在文件ID
PagePID 索引页ID
IAMFID File ID of the IAM managing this page,IAM page的IAMFID=NULL
IAMPID Page ID of the IAM managing this page,IAM page的IAMPID=NULL
ObjectID 对象ID
IndexID 索引类型ID,0表示堆,1表示聚集索引,2-1005表示非聚集索引。可以在sys.indexs上查找
PartitionNumber Partition number within the table or index for this page
PartitionID ID for the partition containing this page (unique in the database)
iam_chain_type Type of allocation unit this page belongs to: in-row data, row-overflow data, or LOB data
PageType Page type: 1 = data page, 2 = index page, 3 = LOB_MIXED_PAGE, 4 = LOB_TREE_PAGE, 10 = IAM page
IndexLevel 索引级别,0表示叶子节点,根节点的级别最高
NextPageFID File ID for next page at this level,同一level上,下一个索引页所在文件的ID
NextPagePID Page ID for next page at this level
PrevPageFID File ID for previous page at this level
PrevPagePID Page ID for previous page at this level,同一level上,上一个索引页的PageID

微软推荐使用 DMF: sys.dm_db_database_page_allocations 来代替 DBCC IND命令

二,使用DBCC IND查看Heap结构

Create table dbo.MyHeap
(
ID int identity,
Fill nchar(3900)
)
go

--Insert 11 rows
insert into dbo.MyHeap
default values;
go 11

--Output
--DataBaseID    TableID
--7            1136056991
select db_id() as DataBaseID,object_id(Ndbo.MyHeap,NU) as TableID

使用DBCC IND查看Heap 分配的Page

DBCC IND (7,1136056991,0)

分析结果:共有13行,2个IAM Page,11个Data page

1,IAM Chain

  有两个IAM Page (page Type=10),两个IAM Page组成一个chain,Chain是一个双向链表结构,后向指针(NextPageFID ,NextPagePID),前向指针(PrevPageFID,PrevPID)

2,Data Page

  11个Data page之间没有双向链接,而是松散存放,使用IAM链接起来,每个Data Page的IAMFID 和IAMPID指向IAM Page。

3,Index Structure

  IndexLevel=0,表示Page是Index的Leaf-Level。Heap中的data page没有层次结构,都是Data node,Heap的Data Node可以看作Index leaf level。

技术分享

三,使用DBCC IND查看BTree 结构,Index 是Clustered Index

Create table dbo.MyBTree
(
ID int identity primary key clustered,
Fill nchar(3900)
)
go

--Insert 11 rows
insert into dbo.MyBTree
default values;
go 11

--Output
--DataBaseID    TableID
--7             1152057048
select db_id() as DataBaseID,object_id(Ndbo.MyBTree,NU) as TableID


DBCC IND (7,1152057048,1)

分析结果:共有14行,2个IAM,11个Data Page,1个Index Page

1,IAM Chain

  2个IAM Page组成一个IAM Chain,使用双向链表连接起来

2,Data Page

  11个Data Page组成一个双向链表,Clustered Index Key定义了Data page的存储的逻辑顺序

3,Index Page

  IndexLevel 最高的字段是Root Node,IndexLevel>0的page都是Index page,存储的数据是Index 结构信息。

  IndexLevel=0,表示Page是Index的Leaf-Level,如果IndexID是1,该Index是clustered Index, Leaf-Level 是table的data page。

Note:将一个Table由Heap结构转变成BTree结构,Data Page的数量不变,增加的是Index Page的数量,为了管理更多的Index Page,IAM chain可能会变长,即增加IAM page来track clustered Index(Index page和 Data Pages)。

技术分享

 

四,使用DBCC IND查看BTree 结构,Index 是NonClustered Index

不管Nonclustered index是创建在Table的任一结构(Heap或BTree)上,Nonclustered index的结构是相同的。

1,查看Heap上的Nonclustered index structure

create index ix_MyHeap_ID
on dbo.MyHeap(ID)

DBCC IND (7,1136056991,2)

分析结果:2行,一个IAM Page,一个Index page

IAM Page用以track DB Object使用的存储空间,在Heap上创建一个Nonlustered Index,为了标识该Index使用的存储空间(Index Page),Sql server 新建了一个IAM chain。

Note:在创建Clustered Index时,并没有新建IAM Chain,说明Clustered index 就是Table本身,只不过使用Index page 将Data page 组织起来。

技术分享

2,查看BTree上的Nonclustered index structure

为BTree 增加一个Column,并创建 Nonclustered index structure

alter table dbo.MyBTree
add code int not null
constraint DF_MyBTree_code default(1);

create index ix_MyBTree_code
on dbo.MyBTree(code);

查看NonClustered Index page

DBCC IND (7,1152057048,2)

分析结果:共2行,一个IAM Page,一个Index Page

技术分享

 

五,总结

1,Heap 结构

  • 只有Data Page 和IAM Page,没有Index page
  • Data Page 之间没有双向链接,是松散的存在
  • Heap中的data page没有层次结构,都是叶子节点,IndexLevel=0
  • IAM Page 是一个Chain结构,有双向链接

2,Clustered Index结构

  • Clustered Index 有Data Page,IAM Page 和 Index page
  • Data Page 是Index 的leaf level,IndexLevel=0,Data pages之间存在双向链接
  • Index Page是一个层次结构,IndexLevel最高的是Root Node,处于同一个Level上的Index Pages之间存在双向链接
  • IAM Page 是一个Chain结构,有双向链接

3,NonClustered Index结构

  • NonClustered Index 有IAM Page 和 Index page,没有Data page
  • Index page有层次结构,处于同一个Level的Index pages之间存在双向链接
  • IAM Page 是一个Chain结构,有双向链接

 

使用 DBCC IND 查看BTree 和 Heap结构

原文:http://www.cnblogs.com/ljhdo/p/5137590.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!