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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为畅享max有没有人脸识别_华为手机有人脸识别功能吗?

展开全部华为5X有的1、请插e5a48de588b63231313335323631343130323136353331333365633837入手机卡,开启数据业务。第一次使用“人脸解锁”功能时,需要连接网络之后才可以激活。所以当第一次进入系统设置->安全->屏幕锁定中,可能会不能马…

c 语言 结构体 编程,C语言:结构体的编程问题(很简单)

C语言:结构体的编程问题(很简单)答案:2 信息版本:手机版解决时间 2020-07-25 02:18已解决2020-07-24 02:27先定义一个结构体Student,它包含四个成员:学号(number)、姓名(name)、电话(telphone)、地址(address),然后定…

gin 怎么通过 post 发送结构体_Go Web 框架 Gin 实践12—优化配置结构及实现图片上传...

Go语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!项目地址:https://github.com/EDDYCJY/go-gin-example如果对你有所帮助,欢迎点个 Star 前言一天,产品经理突然跟你…

python次方运算_neg__python 魔术方法1 运算符重载

python中存在一些特殊的方法,这些方法通常采用格式:__method__()。这些方法会在特定的情况下自动调用。例如:__new__()、__init__()、__del__() 等生命周期方法。正是这些特殊方法,构建了python的语言风格。特殊方法有很多&#x…

resnet50网络结构_AAAI2020 | 利用网络结构关系加速NAS+Layer

这是我在海康威视研究院实习的工作,被AAAI-2020接收为Spotlight。论文地址:http://xxx.itp.ac.cn/pdf/2002.12580v1引子上一个阶段的网络结构搜索(NAS)研究,主要在两个方面。1)各类搜索方法,从强化学习、进化算法等到梯度下降&…

python 去除nan inf_Python实现半自动评分卡建模(附代码)

作者:Summer Memories个人公众号:风控汪的数据分析之路知乎专栏:小鑫的数据分析笔记这次分享一个自己写的python脚本,可以实现半自动化的评分卡建模。运行脚本时需要input已经预处理好的训练集和测试集数据,所以建模前…

国嵌c语言深度,国嵌C语言3部全

课程目录:国嵌 C语言深度剖析班:1课-基本数据类型分析2 auto,register,static分析3 if,switch,do,while,for分析4 goto,void,extern,sizeof分析5 const和volatile分析6 struct和union分析7课-enum和typedef分析8 注释符号9 接续符和转义符10 单引号和双引…

linux如何判断网线插入_“Linux”中如何判断哪个网卡连接网线?

展开全部【解决方法】1、ifconfig查看现在使用的网e68a84e8a2ad3231313335323631343130323136353331333365633935卡。2、ethtool命令查看网卡的具体信息,如eth0是连接状态,则正常使用。2、在ifconfig中可以看到有eth2这个网卡,但不知道是否连线&#xff…

单调有界定理适用于函数吗_《实变函数》——论有界变差函数

一日不见如隔三秋,本人觉得有界变差函数是实变函数中最容易理解且和高等数学联系最紧密的一个概念,其在概率论中也有非常广泛的应用,也和勒贝格空间有着千丝万缕的联系。什么叫有界变差函数?若在区间(a,b)中&#xff0…

msp430 c语言开发环境,如何使用C语言来编写MSP430的高质量代码

微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑,一般都要求尽量节省使用资源,并且,由于微处理器硬件一般都不支持有符号数、浮点数的运算,且运算位有限,因此,分配变量时必须仔细。另外要说…

oracle 增量设为3 循环_Oracle 差异性增量 和 累计增量 原理(转)

RMAN一个强大的功能是支持增量备份,增量备份中心思想就是减少备份的数据量,我们不需要在从头开始备份了,只需要备份自上次已备份之后的数据块即可。Oracle 9i 共有五种级别 0 1 2 3 4,0级最高-4级最低,0级是1级的基础以…

springboot redis 断线重连_Redis(9)——史上最强【集群】入门实践教程

一、Redis 集群概述Redis 主从复制到 目前 为止,我们所学习的 Redis 都是 单机版 的,这也就意味着一旦我们所依赖的 Redis 服务宕机了,我们的主流程也会受到一定的影响,这当然是我们不能够接受的。所以一开始我们的想法是&#xf…

智能指针的释放_看完这篇,别再说不会智能指针了

C智能指针一、智能指针的作用上一篇介绍了内存池的原理和实现,详情请见内存池设计与实现;内存池可以帮助我们有效的对内存进行管理,智能指针可以很方便的管理指针,避免出现内存泄漏;智能指针的作用智能指针的作用&…

c语言输出后面空格,新人提问:如何将输出时每行最后一个空格删除

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何将每行最后一个空格删除&#xff0c;使矩阵只有数字间有空格&#xff0c;没有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

pandas 日期比较大小_pandas处理日期时间,按照时间筛选

pandas有着强大的日期数据处理功能&#xff0c;本期我们来了解下pandas处理日期数据的一些基本功能&#xff0c;主要包括以下三个方面&#xff1a;按日期筛选数据按日期显示数据按日期统计数据运行环境为 windows系统&#xff0c;64位&#xff0c;python3.5。1 读取并整理数据首…

python中符号输入_Python基础(输入、运算符)

输入 1. python2版本中 1.1 使用 raw_input()函数&#xff0c; 看如下示例: password raw_input("请输入密码:") print &#xff08;您刚刚输入的密码是:%s, % password&#xff09; 运行结果:注意: raw_input()的小括号中放入的是&#xff0c;提示信息&#xff0c;…

c语言课程教学改革,C语言课程教学改革和实践.doc

C语言课程教学改革和实践C语言课程教学改革和实践程序设计课程在计算机科学(Computer Science&#xff0c; CS)专业新生的教学中起着相当基础的作用&#xff0c;CS专业包括计算机科学与技术、软件工程和网络工程。尽管近年来涌现了很多新的程序设计语言&#xff0c;如java&…

audio接线图解_图文:主板跳线(排线)连接技巧HD AUDIO连线接法

作为一名新手&#xff0c;要真正从头组装好自己的电脑并不容易&#xff0c;也许你知道CPU应该插哪儿&#xff0c;内存应该插哪儿&#xff0c;但遇到一排排复杂跳线的时候&#xff0c;很多新手都不知道如何下手。钥匙开机其实并不神秘还记不记得你次见到装电脑的时候&#xff0c…

code blocks c语言,Code Blocks安装与使用图文教程(使用Code::Blocks编写C语言程序)...

CodeBlocks 完全支持单个源文件的编译&#xff0c;如果你的程序只有一个源文件(初学者基本上都是在单个源文件下编写代码)&#xff0c;那么不用创建项目&#xff0c;直接运行即可&#xff1b;如果有多个源文件&#xff0c;才需要创建项目。1) 新建源文件打开 CodeBlocks &#…

python链表实现栈_python实现链表队列栈

#!/usr/bin/python # -*- coding: utf-8 -*- #便于测试 data 使用数字 class Node(object): def __init__(self,data): self.data data self.next None self.prev None class List(object): def __init__(self): self.next self self.prev self self.size 0 # 是否为空 d…