1.SqlServer2008R2表扫描

(1).现象

创建表并插入3条数据

SqlServer2008R2中的表扫描 _Data

上面的Person我是一个索引都没建,然后where一下,看看表扫描是啥样的?

SqlServer2008R2中的表扫描 _Data_02

果然是看到了万恶的“表扫描”三个字,既然是万恶的东西,我们一定要深刻了解下,然后我们才可以怎么去想办法避免它。。。所以我们一定要理解到本 质,那问题来了,它到底是怎么扫的呢???怎么破呢?这个还必须得从数据页说起。

2.理解表扫描

(1).数据页

记录都是以数据页形式存储的,而且还应该知道数据页的大小是8k。。。。那数据页在哪里?

SqlServer2008R2中的表扫描 _bc_03

乍一看我画了好多,千万不要怕,不要以为画的多,就以为高深了。。。我简单的剖析下。

1).dbcc ind 命令

你要是想看数据页的相关情况,sqlserver还真提供了专用命令dbcc 满足你,你可能会问sqlserver中有提供ind命令的参数吗?告诉你吧,还真有的,不过这个要开启2588跟踪,就像下面这样。

SqlServer2008R2中的表扫描 _表数据_04

2).PageFID,PagePID,IAMFID

刚才也说了,数据页有很多种,默认说的都是表数据页,其实还有IAM数据页,没什么稀奇的,IAM就是用来跟踪表数据页的,所以上面的图中,IAMFID字段为Null的记录就是IAM页,下面的PagePID=78的,就是表数据页。

(2).查看数据页

为避免大家糊涂了,我先还是说说数据页内部结构大概是个什么样子,好让大家有个整体印象。

SqlServer2008R2中的表扫描 _Data_05

从图中可以看到,在数据页的尾部是有很多槽位的,这些槽位指向了Data区域中一条条实际记录的地址,所以说表扫描,其实就是扫这些Slot槽位, 还是拿上面的Person表中的三条记录来说,他们都是保存在78号数据页中,现在出于好奇心把78号数据页导出来,说干就干。。。。很简单,你需 要做两件事情:

1).开启3604跟踪: dbcc traceon(3604)

2).使用dbcc page 命令导出1号文件下面的78号数据页(pageFID:pagePID)=(1:78),就像下面这样,数据页头(PAGE HEADER):

SqlServer2008R2中的表扫描 _bc_06

数据内容(Page Data): 

SqlServer2008R2中的表扫描 _表数据_07

数据槽位(Page Slot):

SqlServer2008R2中的表扫描 _bc_08

有没有看到上面(0,1,2)三个槽位,并且都有相应的偏移地址(0x7e,0x92,0xba),这个地址就指向了Data区域实际记录的偏移地址。