首页 > 其他 > 详细

005_堆行溢出

时间:2015-02-10 22:50:27      阅读:304      评论:0      收藏:0      [点我收藏+]

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

005_堆行溢出

原文:http://www.cnblogs.com/heibaitan/p/4284977.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!