剖析SQLSERVER2005的页面结构--行类型篇一
剖析SQLSERVER2005的页面结构
行类型篇一
全文阅读剖析SQLSERVER2005的页面结构
行(和我平常说的表的记录行有点差别哦,注意理解)简单的可理解为数据库物理存储的表、索引及其它类型的数据的基本单元。当然行结构远不止如下说明的那么简单,更深入的有待再度剖析,比如打开行版本后slot记录就会多出14个字节的xsn。
行记录是表里的数据,记录着表的内容。反之也就是表的记录是以数据行的形式保存在数据库的页面上。它一般是堆表的行或索引的叶级行,显然的是它一定保存着行的所有列数据,在这儿我们得注意一下,这个所有的列包含两层意思 ,一就是列的数据,另外可能是行溢出数据的指针。指针的情况又分为两种可能:一是使用了LOB数据类型,另一个是非LOB类型存储在超行最大8060限制时。这些不在此篇讨论的范围,一带而过。
关于如何查看页面内容的方法我在 SQL2005中的事务与锁定(九)一文有详细的说明,下面为了便于说明先写一个测试用例:
create table testtb(id int identity(1,1),col char(985))goinsert into testtbselect REPLICATE('a',5) union allselect REPLICATE('b',5) union allselect REPLICATE('c',5) union allselect REPLICATE('d',5) union allselect REPLICATE('e',5) union allselect REPLICATE('f',5) union allselect REPLICATE('g',5) union allselect REPLICATE('h',5) union allselect REPLICATE('i',985) union allselect REPLICATE('j',985)goalter table testtb alter column col char(1000) --godbcc ind(testcsdn,testtb,-1)--220 221 232dbcc traceon(3604)dbcc page(testcsdn,1,220,1)/*DATA:Slot 0, Offset 0x60, Length 9, DumpStyle BYTERecord Type = FORWARDING_STUB Record Attributes = Memory Dump @0x4431C0600000000: 04dd0000 00010002 00?????????????????......... Slot 1, Offset 0x69, Length 1996, DumpStyle BYTERecord Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Memory Dump @0x4431C069......Slot 2, Offset 0x835, Length 9, DumpStyle BYTERecord Type = FORWARDING_STUB Record Attributes = Memory Dump @0x4431C835...... 000007C0: 20202020 20202020 200300f8 ?????????? ... DBCC 执行完毕。如果DBCC 输出了错误信息,请与系统管理员联系。*/dbcc page(testcsdn,1,221,1)/*PAGE: (1:221)DATA:Slot 0, Offset 0x1014, Length 1996, DumpStyle BYTERecord Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Memory Dump @0x3432D01400000000: 1000c907 09000000 69696969 69696969 ?.......iiiiiiii ............Slot 2, Offset 0x60, Length 2010, DumpStyle BYTERecord Type = FORWARDED_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNSMemory Dump @0x3432C06000000000: 3200c907 01000000 61616161 61202020 ?.......aaaaa */----------------------------------- Author : HappyFlyStone -- Date : 2009-11-30-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) -- Apr 14 2006 01:12:25 -- Copyright (c) 1988-2005 Microsoft Corporation-- Enterprise Edition on Windows NT 5.2 (Build 3790: SP2)-- 转载注明出处及相关信息---------------------------------CREATE PROC sp_us_FPSinfo@FORWARDING_STUB BINARY(8)ASSELECT CAST( CONVERT(INT,SUBSTRING(@FORWARDING_STUB,6,1)) * POWER(2,8) + CONVERT(INT,SUBSTRING(@FORWARDING_STUB,5,1)) AS VARCHAR)+' : ' --File_num +CAST( (CONVERT(INT,SUBSTRING(@FORWARDING_STUB,4,1)) * POWER(2,24)) + (CONVERT(INT,SUBSTRING(@FORWARDING_STUB,3,1)) * POWER(2,16)) + (CONVERT(INT,SUBSTRING(@FORWARDING_STUB,2,1)) * POWER(2,8 )) + (CONVERT(INT,SUBSTRING(@FORWARDING_STUB,1,1))) AS VARCHAR) +' : ' --Page_id +CAST(CAST(SUBSTRING(@FORWARDING_STUB,8,1) * POWER(2,8 ) + + SUBSTRING(@FORWARDING_STUB,7,1) AS INT ) AS VARCHAR) AS 'FILE_NUM:PAGE_ID:SLOT_ID'GOEXEC sp_us_FPSinfo 0xDD00000001000200 --DROP PROC sp_us_FPSinfo/*FILE_NUM:PAGE_ID:SLOT--------------------------1 : 221 : 2(1 行受影响)*/