sqlserver查看索引_SQL Server页中行物理存储

SQL Server页有很多类型:

1 – 数据页. 记录堆或者聚集索引叶子级的数据

2 – 索引页. 用于保存聚集索引中的中间页和根页,或者非聚集索引的所有页

3 – text mix page. A text page that holds small chunks of LOB values plus internal parts of text tree. These can be shared between LOB values in the same partition of an index or heap.

4 – text tree page. A text page that holds large chunks of LOB values from a single column value.

7 – sort page. A page that stores intermediate results during a sort operation.

8 – GAM page. Holds global allocation information about extents in a GAM interval (every data file is split into 4GB chunks – the number of extents that can be represented in a bitmap on a single database page). Basically whether an extent is allocated or not. GAM = Global Allocation Map. The first one is page 2 in each file. More on these in a later post.

9 – SGAM page. Holds global allocation information about extents in a GAM interval. Basically whether an extent is available for allocating mixed-pages. SGAM = Shared GAM. the first one is page 3 in each file. More on these in a later post.

10 – IAM page. Holds allocation information about which extents within a GAM interval are allocated to an index or allocation unit, in SQL Server 2000 and 2005 respectively. IAM = Index Allocation Map. More on these in a later post.

11 – PFS page. Holds allocation and free space information about pages within a PFS interval (every data file is also split into approx 64MB chunks – the number of pages that can be represented in a byte-map on a single database page. PFS = Page FreeSpace. The first one is page 1 in each file. More on these in a later post.

13 – boot page. Holds information about the database. There's only one of these in the database. It's page 9 in file 1.

15 – file header page. Holds information about the file. There's one per file and it's page 0 in the file.

16 – diff map page. Holds information about which extents in a GAM interval have changed since the last full or differential backup. The first one is page 6 in each file.

17 – ML map page. Holds information about which extents in a GAM interval have changed while in bulk-logged mode since the last backup. This is what allows you to switch to bulk-logged mode for bulk-loads and index rebuilds without worrying about breaking a backup chain. The first one is page 7 in each file.

PFS页= 96+4+8088+4 间隔8088, 96页头,4行头,slot0 8088 ,4slotlist

GAM/SGAM=96+4+90+4+7988+10 间隔 7988*8,96页头,4行头,90slot0,4行头,7988slot1,10slotlist

IAM页 =      96+4+90+4+7988+10 96页头,4行头,90slot0,4行头,7988slot1,10slotlist 

1.   数据页行存储格式

数据页的基本格式:

数据页的基本格式:

信息

助记符

大小(Byte)

状态A

TagA

1

状态B

TagB

1

固定长度大小

Fsize

2

固定长度数据

Fdata

Fsize-4

列数量

Ncol

2

NULL位图(表中每列一个位;1表示对应列为null)

Nullbits

Ceil(Ncol/8)

行中存储的可变长度列数

VarCount

2

可变长度的偏移阵列

VarOffset

2*VarCount

可变长数据

VarData

VarOffset[VarCount]-(Fsize+8-4+ Ceil(Ncol/8)+2*VarCount)

实例:

USE db_TestEnvcreate table Index_test(id int,a varchar(10))goinsert into Index_test select 100,'aaaaa'go 4000DBCC IND(db_TestEnv,Index_test,1)DBCC PAGE(db_TestEnv,1,45969,1)

输出

Slot 0, Offset 0x60, Length 20, DumpStyle BYTE Record Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNSRecord Size = 20                    Memory Dump @0x613BC060 00000000:   30000800 64000000 02000001 00140061 †0...d..........a        00000010:   61616161 ††††††††††††††††††††††††††††aaaa   

a.      第一个字节 TagA = 0x30 是由2个部分组成0x10(第4个位) 和0x20(第5个位),其中0x10表示有null列,0x20表示有可变长,0x40(第6个位)表示有版本标记,0x80(第7个位)表示TagB是否有值。

其中1-3位为行类型分别意思如下:

        0:primary record,堆上的数据页或者聚集索引的叶子页。

        1:forwarded record,  被转发页

        2:forwarding record,转发根存页(在行移动时会出现转发页和转发根存页如行溢出,可以查看《深入解析sql server 2008》 5.7.4.1 和6.7.4.1的相关内容)

        3:index record,聚集索引非叶子页或者非聚集索引记录

        4:blob record,blob记录

        5:ghost index record ,影子索引,被删除了没被清理,可以使用显示事务来观察

        6:ghost data record,影子记录,被删除了没被清理,可以使用显示事务来观察

        7:ghost version record,幻想记录,详细请看《深入解析 SQL Server 2008》 10.7.3.8

b.      第二个字节TagB有2个取值0x00,0x01.如果是0x01说明是被转发页的幻影页。若为0x01则为TagA字节的解释

其他的不需要解释了,更具上面的表格就可以。

2.   索引页行存储格式

索引页行存储格式分为2种:1.非叶子,2.叶子。但是会因为是堆表上的非聚集索引,还是聚集索引表上的非聚集索引有所不同。是否include对索引的存储格式没啥影响。

1.堆表下

实例:

USE db_TestEnvcreate table Index_test(id INT IDENTITY,a char(10),b VARCHAR(10))goinsert into Index_test select 'aaaaa','bbb'go 4000create nonclustered index ix_id_a on Index_test(id,a)

1.1  叶子页

基本格式

基本格式

信息

助记符

大小(Byte)

行头

Header

1

定长建值

Fkey

定长大小

表记录Rowid(fileid:page:slote)

RowID

8(4数据页,2页号,2槽号)

索引记录包含的字段个数

col

2

NULL位图(表中每列一个位;1表示对应列为null)

Nullbits

Ceil(可为空列数/8)

行中存储的可变长度列数

VarCount

2

可变长度的偏移阵列

VarOffset

2*VarCount

可变长数据

VarData

VarOffset[VarCount]-(Fkey+12+ Ceil(可为空列/8)+2*VarCount)

DBCC PAGE(db_TestEnv,1,41006,1)

输出

Slot 0, Offset 0x60, Length 26, DumpStyle BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 26Memory Dump @0x6128C06000000000:   16220100 00616161 61612020 202020f2 †."...aaaaa     .        00000010:   e1000001 00200003 0000†††††††††††††††..... ....  

a.      第一个字节header有以下的意义:

0x40:对于记录类型为索引记录总为0

0x20: 包含可变长字段

0x10: 包含null位图数据

        1-3bit 表示是否是索引记录

         其他就不需要解释了,按照表格可以轻易的得出。

1.2  非叶子页

基本格式

信息

助记符

大小(Byte)

行头

Header

1

定长建值

Fkey

定长大小

表记录Rowid(fileid:page:slote)

RowID

8(4数据页,2页号,2槽号)

下一个页所在的叶子节点(fileid:page)

KeyRowid

6(4数据页,2页号)

索引记录包含的字段个数

col

2

NULL位图(表中每列一个位;1表示对应列为null)

Nullbits

Ceil(可为空列数/8)

行中存储的可变长度列数

VarCount

2

可变长度的偏移阵列

VarOffset

2*VarCount

可变长数据

VarData

VarOffset[VarCount]-(Fkey+18+ Ceil(可为空列/8)+2*VarCount)

DBCC PAGE(db_TestEnv,1,41007,1)

输出

Slot 0, Offset 0x60, Length 32, DumpStyle BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 32Memory Dump @0x6095C06000000000:   16010000 00616161 61612020 202020f0 †.....aaaaa     .        00000010:   e1000001 0000007c 8d010001 00030000 †.......|........   

叶子非叶子没有什么大的区别就是非叶子少了键值所在的叶子节点。需要注意的是唯一索引的非叶子比较特别没有表记录Rowid。

2.在聚集索引下的非聚集索引

2.1叶子节点

信息

助记符

大小(Byte)

行头

Header

1

定长建值+聚集索引定长值

Fkey

定长大小

索引记录包含的字段个数

col

2

NULL位图(表中每列一个位;1表示对应列为null)

Nullbits

Ceil(可为空列数/8)

行中存储的可变长度列数

VarCount

2

可变长度的偏移阵列

VarOffset

2*VarCount

可变长数据

VarData

VarOffset[VarCount]-(Fkey+18+ Ceil(可为空列/8)+2*VarCount)

create table Index_test(id INT IDENTITY,a varchar(10),b VARCHAR(10),iid)goinsert into Index_test select 'aaaaa','bb'go 4000UPDATE dbo.Index_test SET iid = id+1create clustered index cix_id_a on Index_test(id,a)GOCREATE NONCLUSTERED INDEX [idx__iid] ON [dbo].[Index_test]([iid],[b])DBCC PAGE(db_TestEnv,1,164560,1)

输出

Slot 0, Offset 0x60, Length 25, DumpStyle BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP VARIABLE_COLUMNSRecord Size = 25                    Memory Dump @0x6083C06000000000:   36214104 00204104 00050000 02001400 †6!A.. A.........        00000010:   19006262 61616161 61†††††††††††††††††..bbaaaaa

这个没什么难度,第一个字节 Header 和其他的都一样就是聚集索引上的非聚集索引会带上聚集索引的key,在实例中:21410400 为自己的iid,20410400为id主键,6262为key的键,6161616161为聚集索引key。

如果聚集索引是可重复的,sql server会产生一个消除重复的数字,被当成可变长存放在可变成区域

2.2非叶子节点

信息

助记符

大小(Byte)

行头

Header

1

定长建值+聚集索引定长值

Fkey

定长大小

下一个页所在的叶子节点(fileid:page)

KeyRowid

6(4数据页,2页号)

索引记录包含的字段个数

col

2

NULL位图(表中每列一个位;1表示对应列为null)

Nullbits

Ceil(可为空列数/8)

行中存储的可变长度列数

VarCount

2

可变长度的偏移阵列

VarOffset

2*VarCount

可变长数据

VarData

VarOffset[VarCount]-(Fkey+18+ Ceil(可为空列/8)+2*VarCount)

UPDATE dbo.Index_test SET b = b+RTRIM(id) 重建索引DBCC PAGE(db_TestEnv,1,177184,1)

输出

Slot 0, Offset 0x60, Length 32, DumpStyle BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP VARIABLE_COLUMNSRecord Size = 32                    Memory Dump @0x607AC06000000000:   36020000 00010000 00e0b302 00010005 †6...............        00000010:   00000200 1b002000 62623161 61616161 †...... .bb1aaaaa  

第一个字节和其他的都一样不解释,其他的按表格都可以解析

如果聚集索引是可重复的,sql server会产生一个消除重复的数字,被当成可变长存放在可变成区域

3.聚集索引中

在聚集索引下只有非叶子页才是索引页

基本格式

信息

助记符

大小(Byte)

行头

Header

1

一下层最小固定聚集索引建值

Fkey

固定聚集索引建大小

一下层页号(fileid:page)

KeyRowid

6(4数据页,2页号)

索引记录包含的字段个数

col

2

NULL位图(表中每列一个位;1表示对应列为null)

Nullbits

Ceil(可为空列数/8)

行中存储的可变长度列数

VarCount

2

可变长度的偏移阵列

VarOffset

2*VarCount

可变长数据

VarData

VarOffset[VarCount]-(Fkey+18+ Ceil(可为空列/8)+2*VarCount)

实例:

create table Index_test(id INT IDENTITY,a varchar(10),b VARCHAR(10))goinsert into Index_test select 'aaaaa','bb'go 4000create clustered index cix_id_a on Index_test(id,a)GODBCC IND(db_TestEnv,Index_test,1)DBCC PAGE(db_TestEnv,1,51106,1)

输出

Slot 0, Offset 0x60, Length 23, DumpStyle BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP VARIABLE_COLUMNSRecord Size = 23                    Memory Dump @0x6056C06000000000:   36010000 0097b300 00010002 00000100 †6...............        00000010:   17006161 616161††††††††††††††††††††††..aaaaa

转载自:

https://www.cnblogs.com/Amaranthus/archive/2013/01/31/2886581.html

文章经作者授权转载,版权归原文作者所有

图片来源于网络,侵权必删!

e68db6abd37a3f622573c931cc0418ab.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值