通过dbcc page来查看SQL Server表中的数据
转自 http://blog.csdn.net/sqlserverdiscovery/article/details/12622793
在SQL Server中,一般我们都会通过 select * from 表 来查询数据,但有时候,为了探索SQL Server的各种机制,需要看到更原始的数据,或者说是希望从更为底层的方式来看数据,那有没什么办法呢?
其实,通过DBCC PAGE,我们不仅能查看表中的数据,而且还会看到很多内部存储的信息,让你了解SQL Server是如何存储这些数据的。
下面就讲讲如何通过DBCC PAGE来查看表中的数据:
- --1.先建表
- CREATE TABLE test(idd INT NOT NULL,name VARCHAR(10) NULL)
- INSERT INTO TEST
- SELECT 1,'abcdefg'
- UNION ALL
- SELECT 2,'hijklmn'
- --SELECT * FROM TEST
- SELECT *
- FROM sys.tables
- WHERE name = 'test'
- --2.查询元数据
- --hobt_id : 72057594043236352
- SELECT hobt_id
- FROM sys.partitions
- WHERE object_id = object_id('test')
- /*
- first_page :0x790500000100
- 拆分成2部分:0100和79050000
- 这2部分要翻转,也就是0001 和 00000579
- 前面表示fileId,后面是pageId,都是16机制的表示方法,
- 通过calc计算器的转换,就是10进制就是1和1401
- */
- SELECT first_page --转换值的顺序
- FROM sys.system_internals_allocation_units
- WHERE container_id = 72057594043236352
- --3.这里创建一个表,用来存放dbcc page的结果
- if exists(select * from sys.tables where name = 'dbcc_page')
- drop table dbcc_page
- go
- create table dbcc_page
- (
- ParentObject varchar(500),
- Object varchar(2000),
- Field varchar(1000),
- Value nvarchar(max)
- )
- go
- --4.参数分别是数据库名,fileid,pageid,显示格式
- --注意:这里是在自己的电脑上实验,用的master数据库,大家不要在正是服务器上尝试
- /*
- --这样会报错,只能采用下面的,建一个存储过程
- insert into dbcc_page(ParentObject,Object,Field,Value)
- DBCC page(master,1,1401,3) with tableresults
- */
- if exists(select * from sys.procedures where name = 'proc_dbcc_page')
- drop procedure proc_dbcc_page
- go
- create procedure proc_dbcc_page
- as
- DBCC page(master,1,1401,3) with tableresults
- go
- --5.把dbcc page的结果插入到表中
- insert into dbcc_page(ParentObject,Object,Field,Value)
- exec proc_dbcc_page
- --6.查看数据
- select *
- from dbcc_page
- --过滤大部分其他元数据,选出表test中的数据,与最上面的数据相一致
- select OBJECT,
- Field,
- value
- from dbcc_page
- where Object like 'Slot%Column%'
- /*
- OBJECT Field value
- Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4 idd 1
- Slot 0 Column 2 Offset 0xf Length 7 Length (physical) 7 name abcdefg
- Slot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4 idd 2
- Slot 1 Column 2 Offset 0xf Length 7 Length (physical) 7 name hijklmn
- */
除了上面所解析的1401页外,我们还可以查看其他的页:
- /*
- DBCC ind:
- DBCC IND(
- ['database name'|database id],
- tablename,
- indexid,
- -1 shows all indexes and IAMs, -2 just show IAMs
- )
- PageFID: 页所在的文件号
- PagePID: 数据所在文件内的页号
- IndexID: 在sys.indexes中的index_id, -1表示所有索引页和IAM页,-2只显示IAM页
- PageType:表示页的类型,1是数据页,2是索引页,10是保存页本身的IAM页。
- IndexLevel: 是IAM结构的级别。如果0,那么这是索引的叶级别页
- */
- select name,
- index_id -- 0
- from sys.indexes
- where object_id = object_id('test')
- --1.创建表
- if exists(select * from sys.tables where name = 'dbcc_ind')
- drop table dbcc_ind
- go
- create table dbcc_ind
- (
- PageFID numeric(20),
- PagePID numeric(20),
- IAMFID numeric(20),
- IAMPID numeric(20),
- ObjectID numeric(20),
- IndexID numeric(20),
- PartitionNumber numeric(20),
- PartitionID numeric(20),
- iam_chain_type nvarchar(100),
- PageType numeric(20),
- IndexLevel numeric(20),
- NextPageFID numeric(20),
- NextPagePID numeric(20),
- PrevPageFID numeric(20),
- PrevPagePID numeric(20)
- )
- go
- --2.建存储过程
- if exists(select * from sys.procedures)
- drop procedure proc_dbcc_ind
- go
- create procedure proc_dbcc_ind
- as
- dbcc ind(master,test,0)
- go
- insert into dbcc_ind
- exec proc_dbcc_ind
- --3.一共2页,分别是IAM页1402,数据页1401
- select PageFID,
- PagePID,
- OBJECTID,
- IndexID,
- PartitionNumber,
- PartitionID,
- iam_chain_type,
- PageType,
- IndexLevel,
- NextPageFID, --下一页的文件id
- NextPagePID, --下一页的页id
- PrevPageFID,
- PrevPagePID
- from dbcc_ind
小小菜鸟一枚
浙公网安备 33010602011771号