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)

实例:

USEdb_TestEnv

createtable Index_test(id int,a varchar(10))

go

insertinto Index_test select 100,'aaaaa'

go4000

DBCCIND(db_TestEnv,Index_test,1)

DBCCPAGE(db_TestEnv,1,45969,1)

Slot 0, Offset 0x60,

Length 20, DumpStyle BYTE

Record Type =

PRIMARY_RECORDRecord Attributes =NULL_BITMAP VARIABLE_COLUMNS

Record 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,转发根存页(在行移动时会出现转发页和转发根存页如行溢出,可以查看《深入解析sqlserver 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.堆表下

实例:

USEdb_TestEnv

createtable Index_test(id INT IDENTITY,a char(10),b VARCHAR(10))

go

insertinto Index_test select 'aaaaa','bbb'

go4000

createnonclustered 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)

DBCCPAGE(db_TestEnv,1,41006,1)

Slot 0, Offset 0x60, Length 26, DumpStyle BYTE

Record Type = INDEX_RECORDRecord Attributes =NULL_BITMAPRecord Size = 26

Memory Dump @0x6128C060

00000000: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)

DBCCPAGE(db_TestEnv,1,41007,1)

Slot 0, Offset 0x60, Length 32, DumpStyle BYTE

Record Type = INDEX_RECORDRecord Attributes =NULL_BITMAPRecord Size = 32

Memory Dump @0x6095C060

00000000: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)

createtable Index_test(id INT IDENTITY,a varchar(10),b VARCHAR(10),iid)

go

insertinto Index_test select 'aaaaa','bb'

go4000

UPDATEdbo.Index_test SET iid = id+1

createclustered index cix_id_a on Index_test(id,a)

GO

CREATENONCLUSTERED INDEX [idx__iid] ON [dbo].[Index_test]([iid],[b])

DBCCPAGE(db_TestEnv,1,164560,1)

Slot 0, Offset 0x60, Length 25, DumpStyle BYTE

Record Type = INDEX_RECORDRecord Attributes =NULL_BITMAP VARIABLE_COLUMNS

Record Size = 25

Memory Dump @0x6083C060

00000000:36214104 00204104 00050000 02001400 †6!A.. A.........

00000010:19006262 61616161 61†††††††††††††††††..bbaaaaa

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

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

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)

UPDATEdbo.Index_test SET b = b+RTRIM(id)重建索引

DBCCPAGE(db_TestEnv,1,177184,1)

Slot 0, Offset 0x60, Length 32, DumpStyle BYTE

Record Type = INDEX_RECORDRecord Attributes =NULL_BITMAP VARIABLE_COLUMNS

Record Size = 32

Memory Dump @0x607AC060

00000000:36020000 00010000 00e0b302 00010005 †6...............

00000010:00000200 1b002000 62623161

61616161 †...... .bb1aaaaa

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

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

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)

实例:

createtable Index_test(id INT IDENTITY,a varchar(10),b VARCHAR(10))

go

insertinto Index_test select 'aaaaa','bb'

go4000

createclustered index cix_id_a on Index_test(id,a)

GO

DBCCIND(db_TestEnv,Index_test,1)

DBCCPAGE(db_TestEnv,1,51106,1)

Slot 0, Offset 0x60, Length 23, DumpStyle BYTE

Record Type = INDEX_RECORDRecord Attributes =NULL_BITMAP VARIABLE_COLUMNS

Record Size = 23

Memory Dump @0x6056C060

00000000:36010000 0097b300 00010002 00000100 †6...............

00000010:17006161

616161††††††††††††††††††††††..aaaaa

A.第一个字节header和其他的一样

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

0x20:包含可变长字段

0x10:包含null位图数据

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

其他的表格中说明很详细。

参考文档

[1] SQL SERVER 2008数据库技术内幕 李爱海

[3]深入解析SQL SERVER 2008

mysql的助记符是什么意思_SQL Server页中行物理存储相关推荐

  1. jvm四:常量的本质含义以及助记符基本认识

    package com.atChina.jvm; /* * 常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中, * 本质上,调用类并没有直接引用到定义常量的类,因此并不会触发 * 定义常量的 ...

  2. 常见 Java 字节码 指令 助记符

    转自: 常见java字节码 有时候为了能理解JVM对程序所做的优化等,需要查看程序的字节码,因此知道了解一些常见的指令集很重要! 指令码 助记符 说明 0x00 nop 什么都不做 0x01 acon ...

  3. jvm 助记符_您的JVM是否泄漏文件描述符-像我的一样?

    jvm 助记符 前言:此处描述的两个问题是在一年前发现并修复的. 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快 ...

  4. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  5. oracle生成助记符,如何在POA Network开发和部署智能合约

    $ npm install truffle-hdwallet-provider dotenv --save-dev6.从Metamask钱包中复制助记符:设置/显示种子词7.在Truffle项目中创建 ...

  6. JVM指令集(指令码、助记符、功能描述)(转)

    JVM指令集(指令码.助记符.功能描述) 指令码 助记符 功能描述 0x00 nop 无操作 0x01 aconst_null 指令格式:  aconst_null 功能描述:  null进栈. 指令 ...

  7. 用一些助记符表示指令的计算机语言是,2015年海南农村信用社考试营业柜员计算机练习题1...

    2015年海南农村信用社考试营业柜员计算机练习题1 农村信用社考试计算机应用基础 1(营业柜员) 1.第一代计算机的主要应用领域是______. A.军事和国防 B.文字和图形处理 C.自动控制 D. ...

  8. python和汇编_python – 你对这些汇编助记符有什么建议吗?

    上学期大学时,我的计算机语言课程的老师教给我们一个名为 Whitespace的深奥语言.为了更好地学习语言,我的课程非常繁忙(midterms),我在 Python写了一个 interpreter和 ...

  9. 助记符表示指令功能的计算机语言,计算机语言分类.doc

    计算机语言分类 程序设计语言的分类 程序设计语言分为低级语言和高级语言.最初的计算机程序都是用0和1的序列表示的,程序员直接使用的是机器指令,无需翻译,从纸带打孔输入即可执行得到结果.后来为了方便记忆 ...

最新文章

  1. 【winform程序】自定义webrowser控件调用IE的版本
  2. vue 文字无缝滚动_手把手教你搭建 Vue 聊天室
  3. ArcGIS AddIN开发异常之--修饰符“static”对该项无效
  4. .net MVC(存储过程+SQLHelper)
  5. 最长不重复字符串python_Python简单实现查找一个字符串中最长不重复子串的方法...
  6. 数据库性能检查指导方案
  7. 3.2 python实战_线性回归的梯度下降法
  8. ]解决在XP上sqlserver2005客户端安装的问题
  9. python人脸照片分类_Python OpenCV 人脸识别(一)
  10. 技术动态 | ACL 2019 知识图谱的全方位总结
  11. HTML autocomplete
  12. Python基础——yield的使用与解释
  13. Python与Memcached交互
  14. ubuntu安装注意事项:
  15. 简单瀑布流-jquery实现
  16. 美军综合电子信息系统
  17. 显示100以内的所有偶数php,vb100-急需vb编程求100以内所有奇数和及所有偶数和vb编程求100以 爱问知识人...
  18. MongoBD命令大全
  19. 微信小程序 php解密,微信小程序des加密、PHP des解密
  20. 积木式移动互联网App Hybrid框架-modular

热门文章

  1. 【前端】网站图标(小 logo)的实现
  2. chrome浏览器扩展
  3. 字扩展,位扩展和字位扩展
  4. 定义一个描述圆的类,然后生成一个圆对象,最后输出半径、直径和面积。
  5. tomcat 解决startup启动乱码
  6. ZZULIOJ--2835: 未成年人之友
  7. jupyter-notebook 打不开网页解决办法
  8. c语言如何实现自动打开网页,如何在C语言中打开网页链接,谢谢大佬!!!
  9. Cyrillic script
  10. 财神爷商训---范蠡