005_堆行溢出
005_堆行溢出
/*
堆数据表是没有聚集索引的表。即数据行不按任何特殊的顺序存储,数据页也没有任何特殊的顺序。
分配单元是堆或 B 树内用于根据页类型管理数据的页集合。
数据页的结构大体包括三个部分:标头、数据行和行偏移量。
分配单元类型:IN_ROW_DATA 包含除大型对象 (LOB) 数据以外的所有数据的数据行或索引行。
页的类型为 Data 或 Index。
LOB_DATA 以下列一种或多种数据类型存储的大型对象数据:text、ntext、image、xml、varchar(max)、nvarchar(max)、varbinary(max) 或 CLR 用户定义类型 (CLR UDT)。
页的类型为 Text/Image。
ROW_OVERFLOW_DATA 存储在超过 8,060 字节行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中的可变长度数据。
页的类型为 Data。
sys.partitions.partition_id ->【一对一的映射】<- sys.system_internals_allocation_units.container_id
SELECT * FROM sys.system_internals_allocation_units
SELECT * FROM sys.partitions
go
*/
--【f_get_page()】****************************
--创建 把地址转换为具体页码的 函数
CREATE FUNCTION [dbo].f_get_page(@page_num BINARY(6))
RETURNS VARCHAR(11)
AS
BEGIN
RETURN(CONVERT(VARCHAR(2),(CONVERT(INT,SUBSTRING(@page_num,6,1))*POWER(2,8))+
(CONVERT(INT,SUBSTRING(@page_num,5,1))))+':'+CONVERT(VARCHAR(11),
(CONVERT(INT,SUBSTRING(@page_num,4,1))*POWER(2,24))+
(CONVERT(INT,SUBSTRING(@page_num,3,1))*POWER(2,16))+
(CONVERT(INT,SUBSTRING(@page_num,2,1))*POWER(2,8))+
(CONVERT(INT,SUBSTRING(@page_num,1,1)))))
END
--查找 test表的页 相关信息
SELECT total_pages,used_pages,data_pages,
first_page,root_page,first_iam_page,
test.dbo.f_get_page(first_page) first_page_address, --数据页面的第一个页面
test.dbo.f_get_page(root_page) root_address,
test.dbo.f_get_page(first_iam_page) IAM_address --IAM管理页面地址
FROM sys.system_internals_allocation_units
WHERE container_id IN (SELECT partition_id FROM sys.partitions
WHERE object_id in (SELECT object_id FROM sys.objects
WHERE name IN ('test')))
--【Ddbcc page】****************************
--查询dbcc page命令的结果-----------------------------
--1.创建查询表
create table dbcc_page
(
ParentObject varchar(500),
Object varchar(2000),
Field varchar(1000),
Value nvarchar(max)
)
--2.创建查询存储过程
create procedure proc_dbcc_page
as
DBCC page(master,1,89,3) with tableresults
--3.把dbcc page的结果插入到表中
insert into dbcc_page(ParentObject,Object,Field,Value)
exec proc_dbcc_page
--4.查看数据
select *
from dbcc_page
--【Ddbcc page】****************************
DBCC TRACEON(3604)
DBCC PAGE(test,1,86,3)
--【DBCC IND】****************************
--DBCC IND【找到各个类型的页面分布和它们的所在的文件号和页号】-------------
DBCC IND({'dbname'|dbid},{'objectname'|objectID},
{nonclustered indid|1|0|-1|-2}[,partition_number])
{'dbname'|dbid}表示数据库名或者数据库ID
{'objectname'|objectID}表示对象名或者对象ID
{nonclustered indid|1|0|-1|-2}表示显示行内数据分页及指定对象的行内IAM分页信息
1 :显示所有分页的信息,包括IAM分页,数据分页,所有存在的LOB分页和行溢出页,索引分页
-1: 显示所有IAM、数据分页、及指定对象上全部索引的索引分页.
-2: 显示指定对象的所有IAM分页
nonclustered indid:显示所有的IAM、数据分页以及一个索引的索引分页信息。
{partition_number}->可选,为了与中的DBCC IND命令向前兼容.它指定了一个特定分区号,如果不指定,显示所有分区的信息。
--以下是DBCC IND命令输出结果的字段描述------------------
字段名称 字段描述
PageFID 索引文件的ID
PageFID 索引文件的ID
IAMFID 管理该分页的IAM分页所在的文件ID
IAMFID 管理该分页的IAM分页的ID
ObjectID 对象ID
IndexID 索引ID,0 代表堆, 1 代表聚集索引, 2-250 代表非聚集索引
PartitionNumber 表或索引所在的分区号码
PartitionID 包含该分页的分区ID
iam_chain_type 该页所属分配单元类型;行内数据、行溢出数据或Lob数据
PageType 分页类型:1数据页面;2索引页面;3Lob_mixed_page;4Lob_tree_page;10IAM页面
IndexLevel 索引层级,0 代表叶级别分页 ;>0 代表非叶级别层次; NULL 代表IAM分页
NextPageFID 本层下一个分页所在的文件ID
NextPageFID 本层下一个分页ID
PrevPageFID 本层上一个分页所在的文件ID
PrevPageFID 本层上一个分页ID
--------------------------------------------------------
--例:
DBCC IND(test,dbcc_page,1)
--【DBCC IND】****************************
--【DBCC IND】****************************
--【DBCC IND】****************************
--【DBCC IND】****************************
--【DBCC IND】****************************
SELECT * FROM test