惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Recent Announcements
Recent Announcements
H
Help Net Security
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
小众软件
小众软件
Last Week in AI
Last Week in AI
U
Unit 42
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
V
V2EX
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿

博客园 - Brave Heart

不能访问Temporary ASP.NET Files的问题 a href="#"与 a href="javascript:void(0)" 的区别 使用 IntelliTrace 调试应用程序 Javascript实现页面跳转的问题 - Brave Heart - 博客园 估计堆的大小 "服务器 '*********' 上的 MSDTC 不可用"错误的解决方法 Asp.Net在SqlServer中的图片存取技术 [转] SHTML 教程 自增字段的SQL语句解决方案 优化数据库的方法及SQL语句优化原则 DBA在系统设计、开发中的重要性 ADSI概览 .NET平台网站架构调优实践点滴 SQL SERVER 2005 DATABASE--公用表表达式(CTE) 学习.Net的经典网站(转载自CSDN技术中心) 操作Excel生成的mht代码 基本的xml操作类 实现Logo滑动 代码:确定两个日期之间的间隔 (Visual C#)
怎样查看SQL Server数据表的数据页结构(转载)
Brave Heart · 2009-12-04 · via 博客园 - Brave Heart

SQLServer2000提供了一个读取数据页结构的命令DBCC Page。该命令为非文档化的命令,具体如下:

DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])

具体参数描述如下:
dbid          包含页面的数据库ID
dbname    包含页面的数据库的名称
filenum      包含页面的文件编号
pagenum  文件内的页面
printopt    可选的输出选项;选用其中一个值:
                  0:默认值,输出缓冲区的标题和页面标题
                  1:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表
                  2:输出缓冲区的标题、页面标题(整体输出页面),以及行偏移量表
                  3:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表;每一行
                    后跟分别列出的它的列值

要想看到这些输出的结果,还需要设置DBCC TRACEON(3604)。

对于表来说,它所在的dbid或者dbname很容易知道,那么它的filenum和pagenum怎么知道呢?其实这个值存在系统表sysindexes的列first中(当indid为0或者1时,indid为0表示该表是一个堆表,没有任何聚集索引,indid为1表示该索引为聚集索引),列first的数据类型为binary(6),它是以16进制的形式储的,需要进行转换。在16进制中,每两个16进制数字表示一个字节,并且是逆序排列的。比如假设一个表的first的值为0xC70000000100,怎么转换呢?因为它是逆序排列的,并且每两个表示一个字节,所以每次都将剩下first值的最后两位移到转换后数据的最后,具体转换步骤如下:

步骤      此时的first值                转换后的数据
第0步    0xC70000000100
第1步    0xC700000001            00
第2步    0xC7000000                0001
第3步    0xC70000                  000100
第4步    0xC700                      00010000
第5步    0xC7                          0001000000
第6步    0x                              0001000000C7

此时转换完成。数据0001000000C7即是我们需要的数据,其中它的前2组数(即0001)表示该表所在的文件编号;后4组(000000C7)表示该表所在的页码(注意该数据还要转换为10进制的数才能具体知道是多少)。
------------------------------------------------------------------------------------------------------------------------------
完整的代码如下(将设我们要查看的是表test的数据页的结构):

代码

--从sysindexes中取出first的值
declare @first binary(6)
select @first = first from sysindexes where id = object_id('test'and indid in(0,1)
declare @PageNum int
select @PageNum = convert(intsubstring(@first,4,1+ substring(@first,3,1+
substring(@first,2,1+ substring(@first,1,1) )
declare @FileNum int
select @FileNum = convert(intsubstring(@first,6,1+ substring(@first,5,1))
select @FileNum@PageNum--执行DBCC Page
declare @sql varchar(1000)
select @sql = 'dbcc page (''' + db_name() + '''' + convert(varchar(10),@FileNum+ '' + 
convert(varchar(10),@PageNum+ ', 1)'
select @sql
dbcc traceon(3604)
exec (@sql)

执行完上面的语句,就可以查看表test的数据页了。怎么读懂这些输出结果呢?

DBCC Page的输出主要分为5个部分: Page、BUFFER、Page Hearder、Data、OFFSET Table(行的偏移量数组)。

Page指出该表的文件编号及页码。

Buffer指出关于给定页面的缓冲区的信息。

Page Header指出页面中所有标题字段的数据。

Data指出每一行的信息。对于每一行,DBCC Page指出行在槽中的位置,以及该行在页面中的偏移量。页面数据被分成3部分,左列指出的是所显示的数据在行中的字节位置。接着4列包含页面存储的实际数据,以16进制的形式显示。右列包含数据的字符表示(只有字符数据是可读的)。

Offset Table指出页面末尾的行偏移量数组的内容。注意这里并不是行物理存储的顺序,而是以槽的编号的顺序来显示的,不过这里可以通过槽的编号看出它的物理存储顺序,比如槽的编号最小的为物理存储的第一行,依此类推。