SQLServer2012表IAM存储结构探究(一)

2014-11-24 12:15:27 · 作者: · 浏览: 0

SQLServer2012 表IAM存储结构探究

Author:zfive5(zidong)

Email: zfive5@163.com

引子

国庆节期间,一直在翻阅《程序员的自我修养—链接、装载与库》,这本给我的感觉是越看越乱,但总的来说还不错,一句话--优秀程序员就应该知道每一个字节的意义。

看此书前的两本《深入解析SQLServer2008》和《Microsoft SQL Server 2005技术内幕:存储引擎》对IAM解读都是点到为止,让我满脑袋是一堆问号,内心特别想通过IAM找到数据库里的数据,这样才能让我为性能优化打开思路。虽然两本书有些内容重叠,但它们绝对值得收藏和慢慢研读。

\ \

正文

分析例子与数据

通过下面SQL语句建分析的例子库和数据

CREATE TABLE[dbo].[Table6](

[a] [int] IDENTITY(1,1)NOTNULL,

[b] [char](8000)NULL,

[c] [int] NULL

) ON[PRIMARY]

DECLARE @V1 INT

SET @V1=1

WHILE @V1<1000000

BEGIN

insert intoTable6(B,C)values(REPLICATE('c',8000),1)

SET @V1=@V1+1

END

SQL查询后数据如下图:

\

两个命令

两个命令分别是DBCC IND和 DBCC PAGE

DBCC IND 命令用于查询一个存储对象的内部存储结构信息,该命令有4个参数, 前3个参数必须指定。语法如下:

DBCC IND ( { 'dbname' | dbid }, { 'objname' | objid },{ nonclustered indid | 1 | 0 | -1 | -2 } [, partition_number] )

第一个参数是数据库名或数据库ID。

第二个参数是数据库中的对象名或对象ID,对象可以是表或者索引视图。

第三个参数是一个非聚集索引ID或者 1, 0, 1, or 2. 值的含义:

0: 只显示对象的in-row data页和 in-row IAM 页。

1: 显示对象的全部页, 包含IAM 页, in-row数据页, LOB 数据页row-overflow 数据页 . 如果请求的对象含有聚集所以则索引页也包括。

-1: 显示全部IAM页,数据页, 索引页 也包括 LOB 和row-overflow 数据页。

-2: 显示全部IAM页。

Nonclustered index ID:显示索引的全部 IAM页, data页和索引页,包含LOB和 row-overflow数据页。

为了兼容sql server 2000,第四个参数是可选的,该参数用于指定一个分区号.如果不给定值或者给定0, 则显示全部分区数据。.

DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
具体参数描述如下:
dbid: 包含页面的数据库ID
dbname:包含页面的数据库的名称
filenum:包含页面的文件编号
pagenum:文件内的页面
printopt:可选的输出选项;选用其中一个值:
0:默认值,输出缓冲区的标题和页面标题
1:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表
2:输出缓冲区的标题、页面标题(整体输出页面),以及行偏移量表
3:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表;每一行后跟分别列出的它的列值

需要开启3604跟踪标志.

接下来通过执行

dbcc ind('A','Table6',-1),

可以看到如下图数据:

\

1:35646 Table6第1个IAM page

通过执行:

dbcc traceon(3604)

dbcc page('A',1,35646,1)

可以得到所有的:

1:35646 Table6第1个IAM page

1:35662 Table6第2个IAM page

1:35663 Table6第3个IAM page

1:1533712 Table6第4个IAM page

\

每一个IAM page 都可以通过

dbcc traceon(3604)

dbcc page('A',1,35646,1)

dbcc page('A',1,35662,1)

dbcc page('A',1,35663,1)

dbcc page('A',1,1533712,1)

看到内部的数据,其中1,35646 数据如下:

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

PAGE: (1:35646)

BUFFER:

BUF @0x000000047240BF40

bpage = 0x0000000286FAE000 bhash = 0x0000000000000000 bpageno = (1:35646)

bdbid = 7 breferences = 0 bcputicks = 0

bsampleCount = 0 bUse1 = 58643 bstat = 0x9

blog = 0x5adb215a bnext = 0x0000000000000000

PAGE HEADER:

Page @0x0000000286FAE000

m_pageId = (1:35646) m_headerVersion = 1 m_type = 10

m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x200

m_objId (AllocUnitId.idObj) = 98 m_indexId (AllocUnitId.idInd) = 256

Metadata: AllocUnitId = 72057594044350464

Metadata: PartitionId = 72057594040025088 Metadata: IndexId = 0

Metadata: ObjectId = 1541580530 m_prevPage = (0:0) m_nextPage = (1:35662)

pminlen = 90 m_slotCnt = 2 m_freeCnt = 6

m_freeData = 8182 m_reservedCnt = 0 m_lsn = (1236:22589:9)

m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0

m_tornBits = 2069893598 DB Frag ID = 1

Allocation Status

GAM (1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED

PFS (1:32352) = 0x70 IAM_PG MIXED_EXT ALLOCATED 0_PCT_FULL DIFF (1:6) = CHANGED

ML (1:7) = NOT MIN_LOGGED

DATA:

Slot 0, Offset 0x60, Length 94, DumpStyle BYTE

Record Type = PRIMARY_RECORD Record Attributes = Record Size = 94

Memory Dump @0x00000000139FA060

0000000000000000: 00005e00 00000000 00000000 00000000 00000000 ..^.................

0000000000000014: 00000000 00000000 00000000 00000000 00000000 ....................

0000000000000028: 00000000 01003d8b 00000100 3f8b000001004