日期:2014-05-17  浏览次数:20403 次

【SQL SERVER 2005页面存储2之--特殊数据类型在页面中的存储】
本帖最后由 feixianxxx 于 2010-04-06 20:24:27 编辑
发帖排版部好,请进 博文地址:http://blog.csdn.net/feixianxxx/archive/2010/04/05/5452759.aspx

这一篇来讲讲特殊的数据类型在页面中的存储,这里分析2个特殊数据类型:LOB类型和SQL_VARIANT类型
 
LOB数据类型
当表中存在LOB类型数据(TEXT/NTEXT/IMAGE)时候:
默认的情况下(TEXT IN ROWS选项是关闭的)数据是不会存储在DATA页面上的.它是存储在属于自己的LOB页面上的,在数据页面只留下字节的指针;
在设置表选项来改变这个存储机制时候,他有可能会存储在DATA页面上。

那么我们来通过例子具体看下LOB类型数据的存储
/*----------------------------------
*auther:Poofly
*date:2010.3.14
*VERSION:
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
Jul  9 2008 14:43:34 
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 6.1 <X86> (Build 7600: )
*转载请注明出处
*更多精彩内容,请进http://blog.csdn.net/feixianxxx
------------------------------------*/
--建表(表源技术内幕)
if OBJECT_ID('Hastext') is not null
drop table Hastext
GO
create table Hastext 
(
COL1 CHAR(3) NOT NULL,
COL2 VARCHAR(5) NOT NULL,
COL3 TEXT NOT NULL,--此处TEXT字段
COL4 VARCHAR(20) NOT NULL


--插入测试数据
INSERT Hastext 
SELECT 'AAA','BBB',REPLICATE('X',250),'CCC'

--检查页面分布和类型
SELECT convert(char(7), object_name(object_id))  AS name, 
    partition_id, partition_number AS pnum,  rows, 
    allocation_unit_id AS au_id, convert(char(17),type_desc) as page_type_desc,
    total_pages AS pages
FROM sys.partitions p  JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE object_id=object_id('dbo.Hastext');
--有IN_ROW_PAGE  lOB_DATA 分配单元各有页,其中一页为IAM页。


--查找页面具体文件号和页面号
dbcc ind(tempdb,Hastext ,-1)
/*
PageFID PagePID iam_chain_type  PageType 
1       127     In-row data      10
1       126     In-row data      1              ---data page
1       174     LOB data         10 
1       173     LOB data         3              ----LOB page
*/


--查看页面信息
dbcc traceon(3604)        --此追踪可以显示页面输出结果
dbcc page(tempdb,1,126,1) --查看数据页的页面信息
/*
Slot 0, Offset 0x60, Length 40, DumpStyle BYTE

Record Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 40                     
Memory Dump @0x63D8C060

00000000:   30000700&