写这篇文章的开始,我还不知道ALLOCATION SCAN的工作原理是怎样的,网上资料少得可怜
求助了园子里的某位大侠,他看了我的信息几天之后才回复我,不过他的回复里没有答案
这几天一直在苦思冥想,后来终于通过动手,验证出来了,知道ALLOCATION SCAN的工作原理是怎样的(结果中秋节过完就出差去了)
10月3日回到家马上开始动笔
在看下去之前请大家先看一下下面的文章
SQLSERVER聚集索引与非聚集索引的再次研究(上)
SQLSERVER聚集索引与非聚集索引的再次研究(下)
查看SQLSERVER内部数据页面的小插件Internals Viewer
看这篇文章之前一定要非常清楚聚集索引页面/非聚集索引页面和IAM页面的作用
聚集索引页面:有指针,有记录,可以准确定位到数据页面
非聚集索引页面:有指向堆中的指针,可以准确定位到数据页面
IAM页面:IAM页面只知道表中数据页面的分配情况,他不知道这些数据页面里都存储了哪些表中的记录
知识准备
我们回顾一下聚集索引的知识
一个数据页面只有一条记录
大家知道在聚集索引页面里,每一行都会指向一个数据页,如下图
SQL脚本
1 USE [tempdb] 2 GO 3 --DROP TABLE [dbo].[ct1] 4 --建立聚集索引表 5 CREATE TABLE ct1(c1 INT, c2 VARCHAR (5000)); 6 GO 7 --建立聚集索引 8 CREATE CLUSTERED INDEX t1c1 ON ct1(c1); 9 GO 10 11 --插入测试数据 12 DECLARE @a INT; 13 SELECT @a = 1; 14 WHILE (@a <= 3) 15 BEGIN 16 INSERT INTO ct1 VALUES (@a, replicate('a', 5000)) 17 SELECT @a = @a + 1 18 END 19 GO 20 21 22 23 24 --查询数据 25 SELECT * FROM ct1 26 27 28 29 CREATE TABLE DBCCResult ( 30 PageFID NVARCHAR(200), 31 PagePID NVARCHAR(200), 32 IAMFID NVARCHAR(200), 33 IAMPID NVARCHAR(200), 34 ObjectID NVARCHAR(200), 35 IndexID NVARCHAR(200), 36 PartitionNumber NVARCHAR(200), 37 PartitionID NVARCHAR(200), 38 iam_chain_type NVARCHAR(200), 39 PageType NVARCHAR(200), 40 IndexLevel NVARCHAR(200), 41 NextPageFID NVARCHAR(200), 42 NextPagePID NVARCHAR(200), 43 PrevPageFID NVARCHAR(200), 44 PrevPagePID NVARCHAR(200) 45 ) 46 47 TRUNCATE TABLE [dbo].[DBCCResult] 48 -- 49 INSERT INTO DBCCResult EXEC ('DBCC IND(tempdb,ct1,-1) ') 50 51 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 52 53 DBCC TRACEON(3604,-1) 54 GO 55 DBCC PAGE([tempdb],1,175,3) 56 GO