SQLServer 表 索引 在页中的存储

时间:2020-12-05 04:46:51
select * from sys.objects a where a.object_id=OBJECT_ID('aaaa');


select * from sys.partitions b where b.object_id=OBJECT_ID('aaaa'); --index_id=1为聚集索引 index_id=0为堆表  index_id>1为非聚集索引


select * from sys.allocation_units c where c.container_id=72057594042187776; -- 分配单元页


select * from sys.system_internals_allocation_units d where d.container_id=72057594042187776; -- 具体分配单元页
--first_iam_page-->0x 50 00 00 00 01 00-->0x 0001 00000050-->0001=1(文件组编号) 0x00000050=80(页码)
--root_page-->     0x 59 00 00 00 01 00-->0x 0001 00000059-->0001=1(文件组编号) 0x00000059=89(页码)
--first_page-->    0x 78 50 00 00 01 00-->0x 0001 00005078-->0001=1(文件组编号) 0x00005078=20600(页码)
--由此查看出来的信息与 dbcc ind(zws,aaaa,1) 查看出来的信息一致



select * from sys.indexes a where a.object_id=OBJECT_ID('aaaa');    -- index_id=1为聚集索引 index_id=0为堆表  index_id>1为非聚集索引


select * from sys.dm_db_index_physical_stats(DB_ID('zws'),object_id('dbo.aaaa'),1,null,'detailed'); -- 查看B树层数。 


dbcc ind(zws,aaaa,1);    --查看索引的详细信息。


dbcc page('zws',1,89,3);  --由根节点开始,根据 childpageid 和 索引所在列a的值开始下一层的查找。


dbcc page('zws',1,18720,3); -- 中间层,根据 childpageid 和 索引所在列a的值开始下一层的查找。



dbcc traceon(3604);  --打开跟踪标记
Go
dbcc page('zws',1,20602,3);  --叶子节点 
-- 前一页:m_prevPage = (1:20602)              后一页:m_nextPage = (1:20604)  开始地址:Offset 0x4
--Record Type = PRIMARY_RECORD(主记录)   Record Type = INDEX_RECORD(索引记录)   Record Type = GHOST_DATA_RECORD(虚影,sqlserver数据库后台有一个进程会定期清除标记为虚影的数据)
go
dbcc traceoff(3604);  --关闭跟踪标记 
Go