解析SQL SERVER 数据页面头部结构(转)
2010-01-10 12:32
459 查看
解析数据页面头部结构
if object_id('test') is not null
drop table test
go
create table test( id int,birth datetime,name char(10))
insert into test
select 1,'2009-11-27','aaaa' union all
select 2,'2009-11-27','aaaa'
exec sp_spaceused 'test'
结构:
通过dbcc ind (test,test,0) 可以查看到该表有两个页,页号分别为109,和89,其中89为数据页。下面通过dbcc page 我们可以查看到该数据页的头部结构,下面我们就来解析头部结构每一个字段的含义。
dbcc traceon(3604)
dbcc page(test,1,89,1)
注意在头文件中几个重要数据:
1、 pminlen = 26:除了表中固定数据所占的字节数外,还需要加上每行开始的4个字节
的行开销。即:
26=4(行开销)+4(int所占空间)+8(datetime 所占空间)+10(char(10)所占的空间)
2、 m_freeData = 154:页面文件的头结构+(存储每行数据需要的额外空间+数据自身的所占的空间)*(行数)
154=96+(7+22)*2=96+58
3、 m_freeCnt = 8034: 每个页面8K,减去m_freeData,再减去用来记录每行数据行偏移的所需要的空间,(每行2个字节)
8034=8192-154-4
4、 m_slotCnt = 2 该页面中数据的行数
注意下m_freeData这个字段的值,它实际的值是从第一个字节到最后一个字节的空间字节数。假如这个表的结构没有改变过,那么数据的存储是
m_freeData的值是
这三部分数据所占空
间的总和
但是假如修改了表结构,没有进行分页,数据会向后向下移动,那么表的存储情况为变为:
m_freeData的值是
这五部分数据所占空
间的总和
转自http://www.cnblogs.com/trieagle/archive/2010/01/09/1642763.html
if object_id('test') is not null
drop table test
go
create table test( id int,birth datetime,name char(10))
insert into test
select 1,'2009-11-27','aaaa' union all
select 2,'2009-11-27','aaaa'
exec sp_spaceused 'test'
结构:
name | rows | reserved | Data | index_size | unused |
test | 2 | 16 KB | 8 KB | 8 KB | 0 KB |
dbcc traceon(3604)
dbcc page(test,1,89,1)
m_pageId = (1:89) | 数据页号 |
m_headerVersion = 1 | 头文件版本号,从7.0以后,一直为1 |
m_type = 1 | 页面类型,1为数据页 |
m_typeFlagBits = 0x4 | 数据页和索引页为4,其他页为0 |
m_level = 0 | 该页在索引页(B树)中的级数 |
m_flagBits = 0x8000 | 页面标志 |
m_objId (AllocUnitId.idObj) = 83 | |
m_indexId (AllocUnitId.idInd) = 256 | |
Metadata: AllocUnitId = 72057594043367424 | 存储单元的ID |
Metadata: PartitionId = 72057594038386688 | 数据页所在的分区号 |
Metadata: IndexId = 0 | 页面的索引号 |
Metadata: ObjectId = 2089058478 | 该页面所属的对象的id,可以使用object_id获得 |
m_prevPage = (0:0) | 该数据页的前一页面 |
m_nextPage = (0:0) | 该数据页的后一页面 |
pminlen = 26 | 定长数据所占的字节数 |
m_slotCnt = 2 | 页面中的数据的行数 |
m_freeCnt = 8034 | 页面中剩余的空间 |
m_freeData = 154 | 从第一个字节到最后一个字节的空间字节数 |
m_reservedCnt = 0 | 活动事务释放的字节数 |
m_lsn = (30:170:20) | 日志记录号 |
m_xactReserved = 0 | 最新加入到m_reservedCnt领域的字节数 |
m_xdesId = (0:0) | 添加到m_reservedCnt 的最近的事务id |
m_ghostRecCnt = 0 | 幻影数据的行数 |
m_tornBits = 0 | 页的校验位或者被由数据库页面保护形式决定分页保护位取代 |
1、 pminlen = 26:除了表中固定数据所占的字节数外,还需要加上每行开始的4个字节
的行开销。即:
26=4(行开销)+4(int所占空间)+8(datetime 所占空间)+10(char(10)所占的空间)
2、 m_freeData = 154:页面文件的头结构+(存储每行数据需要的额外空间+数据自身的所占的空间)*(行数)
154=96+(7+22)*2=96+58
3、 m_freeCnt = 8034: 每个页面8K,减去m_freeData,再减去用来记录每行数据行偏移的所需要的空间,(每行2个字节)
8034=8192-154-4
4、 m_slotCnt = 2 该页面中数据的行数
注意下m_freeData这个字段的值,它实际的值是从第一个字节到最后一个字节的空间字节数。假如这个表的结构没有改变过,那么数据的存储是
头部结构(96B) |
第一行数据 |
第二行数据 |
剩余空间 |
行的偏移 |
这三部分数据所占空
间的总和
但是假如修改了表结构,没有进行分页,数据会向后向下移动,那么表的存储情况为变为:
头部结构(96B) |
第一行数据 |
第二行数据 |
剩余空间 |
行的偏移 |
这五部分数据所占空
间的总和
转自http://www.cnblogs.com/trieagle/archive/2010/01/09/1642763.html
相关文章推荐
- 解析SQL SERVER 数据页面头部结构
- 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构
- springMVC下的后台controller层获取页面导入的excel数据并解析
- 导出sql server数据表的详细结构
- java数据结构之树基本概念解析及代码示例
- httpClient4.3 模拟Post提交,模拟Post上传文件并解决服务端使用spingMVC时upload.parseRequest(request)解析不到File,Pos简单抓取页面数据
- 关于UEditor插件的使用以及UEditor数据回显问题,数据库存储标签代码前台页面如何解析问题小结
- Kafka源码深度解析-序列12 -Server核心组件之2-ReplicaManager核心数据结构与Replica同步原理
- 腾讯云数据库团队:SQL Server 数据加密功能解析
- SQL SERVER 2005页面存储之--表的数据行在页中的存储
- 解析WPF绑定层次结构数据的应用详解
- SQL Server 导出表结构以及(数据字典)
- 解析无限级树结构,加载dhtmlxTree数据
- SQL Server 处理树结构数据的一个示例
- 统计图页面头部对时间、状态判断查询数据
- 在sql server不同的数据库之间复制表结构和数据
- 多叉树结构:JSON数据解析(二)
- "双向链表"-数据结构算法-之通俗易懂,完全解析
- SQLserver数据文件(MDF)的页面文件头结构剖析
- 对web中JS页面发送JSON数据传给后台解析