SQL SERVER 数据页面头部结构解析

  解析数据页面头部结构:

  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 ind (test,test,0) 可以查看到该表有两个页,页号分别为109,和89,其中89为数据页。下面通过dbcc page 我们可以查看到该数据页的头部结构,下面我们就来解析头部结构每一个字段的含义。

  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)


第一行数据


第二行数据


剩余空间


行的偏移

  m_freeData的值是

  这三部分数据所占空

  间的总和

  但是假如修改了表结构,没有进行分页,数据会向后向下移动,那么表的存储情况为变为:


头部结构(96B)

 

 


第一行数据


第二行数据


剩余空间


行的偏移

时间: 2024-10-22 17:56:21

SQL SERVER 数据页面头部结构解析的相关文章

sql server数据|sql server数据库入侵渗透~~求大神

问题描述 sql server数据|sql server数据库入侵渗透~~求大神 QQ200832005[招聘]渗透测试工程师(可兼职也可接私活) 技能要求 具有至少1年以上的职业黑客攻击经验,并实际操作过各类项目,拒绝理论派.熟悉渗透测试服务器提权方面. 1.掌握MySQL.MSSQL.Oracle.PostgreSQL等一种或多种主流数据库结构以及特殊性. 2.熟悉渗透测试的步骤.方法.流程.熟练掌握各种渗透测试工具. 3.有主机.网络或Web安全渗透测试相关项目实施经验&. 4.对网站/服

将SQL Server数据迁移到MySQL的方法

一.SQL Server中常用数据类型与MySQL不同的地方     二.将SQL Server数据迁移到MySQL需要注意的一些问题     1.唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应的字段都允许存在多个null值.   2.存储过程的语法存在很大的不同,存储过程的迁移是最麻烦的,需要仔细修改.   3.程序中部分写的SQL语句由于语法的不同也要相应的修改.   三.将SQL Server数据迁移到MySQL

SQL Server数据复制到的Access两步走_MsSql

我们今天主要向大家讲述的是把SQL Server数据复制到的Access数据库中的实际操作步骤,把SQL Server数据库中的某些数据复制到的Access数据库中,其表的主要结构是相同的,不要提用openrowset,因为Access文件和SQL Server不在一台机器上. 初步的想法是用两个recordset,一个从SQL取数据,一个往Access里面插入数据 因为表的字段比较多,所以只好用一个循环 while (!m_pRecordset_sql->adoEOF) { m_pRecord

ASP实现备份sql server数据

server|sql|备份|数据 建个bak文件夹啊,放数据! db.asp代码如下: <%dim conndim connstr'on error resume nextset conn=server.CreateObject("adodb.connection")connstr="Provider=SQLOLEDB;data source=192.168.2.1;UID=sa;Pwd=123;DataBase=test"conn.Open connstr

在 SQL Server 2005 中查询表结构及索引

server|索引 在 SQL Server 2005 中查询表结构及索引 -- 1. 表结构信息查询 -- ========================================================================-- 表结构信息查询 -- 邹建 2005.08(引用请保留此信息)-- ========================================================================SELECT     Tab

在SQL Server 2005中查询表结构及索引

server|索引 在 SQL Server 2005 中查询表结构及索引 -- 1. 表结构信息查询 -- ===================================================-- 表结构信息查询-- 邹建 2005.08(引用请保留此信息)-- ====================================================SELECT     TableName=CASE WHEN C.column_id=1 THEN O.name

使用SQL Server数据服务开发功能强大且可扩展的应用程序

本文使用了以下技术: SQL Server 本文将介绍以下内容: SSDS 数据模型 管理实体.容器和颁发机构 创建示例 Web 应用程序 类序列化和反序列化 本专栏基于 SQL Server 数据服务的预发布版本撰写而成.文中包含的所有信息均有可能发生变更. 目录 SSDS 数据模型 构建分类广告系统 添加城市 添加类别 更新和删除实体 添加和删除列表架构 分类 Web 应用程序 类反序列化 使用自定义列表架构

sqlserver-关于oracle向sql server数据迁移问题

问题描述 关于oracle向sql server数据迁移问题 请教各位大神怎么让这个接口程序出来呢 解决方案 在 SQL Server 服务器上要装 Oracle 的客户端,并且做好配置. 其实所有的数据库都需要有客户端才能访问,谁叫SQL Server是微软的呢,装系统的时候就偷偷地把客户端装上去了. 如果是一次性迁移,不如Oracle生成脚本,人工修改一下,到SQL Server中执行. 解决方案二: 可以参考一下这个链接 Microsoft OLE DB Provider for Orac

sql server- 求教一个SQL SERVER数据导入问题

问题描述 求教一个SQL SERVER数据导入问题 我有几个表的数据要导入,每个表大概50到500W数据,为了方便后面对表的数据处理,我会在表中创建组合非聚集索引,请问我在应该在导之前建还是导之后建?如果是导之后建,建起来也挺慢的,有什么方法快速创建吗 解决方案 导入之后建,建立索引需要遍历表,计算每个字段,添加到索引存储中,所以肯定耗时,不管先建还是后建.但是推荐后建. 解决方案二: 检查下并行度参数设置,或者修改sql代码如下 maxdop=8,online=on 解决方案三: 创建速度应该