《SQL Server 2005奥秘》第5章主要研究SQL Server 2005数据文件数据的存储,本节主要介绍的是按照hobt_id获得表的第1个页面
按照hobt_id获得表的第1个页面
在系统视图sys.system_internals_allocation_units中,其container_id字段就代表了hobt_id的值。所以执行下列代码可以查询:
/*定义临时变量用于表示表的对象ID*/
declare @id int
/*定义临时变量用于表示表的名称*/
declare @tablename char(20)
/*定义临时变量用于表示表的hobt_id*/
declare @hobtid bigint
set @tablename='t_test'
set @id=(select object_id from DB_STUDENT.sys.objects where name=@tablename)
set @hobtid=(select hobt_id from DB_STUDENT.sys.partitions where object_id=@id)
select @hobtid
select * from DB_STUDENT.sys.system_internals_allocation_units where container_id=@hobtid
go
光盘代码:\代码\0511.sql。
查询结果如图5-17所示。
图5-17 获得表的存储页面信息 |
分析查询得到的数据如下。
1.allocation_unit_id
这代表存储单元的ID,在数据库中唯一。但是不是对象的hobt_id。
实例中查询到值为72057594044088320。
2.type
这代表分配的存储单元的类型。
实例中为1,代表该存储单元存储的数据是行内数据。
3.type_desc
这代表对type的文字描述信息。
行内数据的描述为:IN_ROW_DATA。
4.container_id
该字段的含义比较特殊。
当存储的是行内数据,即type1时,该字段的值和hobt_id的值一致。两者的关系如下:
DB_STUDENT.sys.system_internals_allocation_units.container_id= DB_STUDENT.sys.partitions.hobt_id
5.filegroup_id
文件组ID。
实例的值为1,代表数据文件的文件组。因为日志文件不适用于文件组的概念,所以该项的值始终为0。
6.total_pages
该存储单元分配的总页面数。
实例为2,代表该表分配了2个页面。
7.used_pages
实际上已经使用的页面数。
8.data_pages
包含下列数据的已经使用的页面数,但不包括内部索引页和分配管理页。
行内数据
LOB数据
行溢出数据
9.first_page
代表第1个页面的数据文件ID和页面ID。
本实例中查询到的值为0x2D0000000100。这中间就蕴含了数据文件的ID和数据页面的ID。
10.root_page
如果是B树存储结构,表示B树的根页面的文件和页面ID,用16进制数值来表示。
本实例中值为0x000000000000。
11.first_iam_page
对于索引,是第1个索引管理页面(IAM页面)的数据文件和页面ID,用16进制数值来表示。
本实例中值为0x4E0000000100。
查询表上分配的页面
可以通过DBCC EXTENTINFO命令来查看给表分配的数据页面的信息。在【Management Studio】中执行下列命令。
dbcc traceon(3604)
go
dbcc extentinfo(DB_STUDENT,t_test)
go
光盘代码:\代码\0512.sql。
查询结果如图5-21所示。
可以看到结果中有1个页面(page_id=45)属于给表分配的页面。通过DBCC EXTENTINFO命令可以判断分配给表的页面数量及页号。而通过系统视图可以查询到首页面号。
查询结果是吻合的。
图5-21 使用DBCC EXTENTINFO命令查看表的页面信息 |
总结研究表数据存储的方法
通过上述研究步骤,我们可以总结一些研究表数据存储的基本方法如图5-23所示。
图5-23 研究表数据存储的方法 |