写这篇文章的开始,我还不知道ALLOCATION SCAN的工作原理是怎样的,网上资料少得可怜

求助了园子里的某位大侠,他看了我的信息几天之后才回复我,不过他的回复里没有答案

这几天一直在苦思冥想,后来终于通过动手,验证出来了,知道ALLOCATION SCAN的工作原理是怎样的(结果中秋节过完就出差去了)

10月3日回到家马上开始动笔

在看下去之前请大家先看一下下面的文章

SQLSERVER聚集索引与非聚集索引的再次研究(上)
SQLSERVER聚集索引与非聚集索引的再次研究(下)
查看SQLSERVER内部数据页面的小插件Internals Viewer

SQLSERVER新建表的时候页面分配情况是怎样的?

存储引擎揭秘:基本结构之四——IAM页,IAM链和存储单元

SQL Server 2008存储结构之IAM结构

看这篇文章之前一定要非常清楚聚集索引页面/非聚集索引页面和IAM页面的作用

聚集索引页面:有指针,有记录,可以准确定位到数据页面

非聚集索引页面:有指向堆中的指针,可以准确定位到数据页面

IAM页面:IAM页面只知道表中数据页面的分配情况,他不知道这些数据页面里都存储了哪些表中的记录

 

 


知识准备

我们回顾一下聚集索引的知识

一个数据页面只有一条记录

大家知道在聚集索引页面里,每一行都会指向一个数据页,如下图

SQLSERVER中的ALLOCATION SCAN和RANGE SCAN

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
View Code

相关文章:

  • 2022-12-23
  • 2021-10-16
  • 2021-10-16
  • 2021-04-25
  • 2021-10-07
  • 2021-10-04
  • 2021-10-12
  • 2022-12-23
猜你喜欢
  • 2021-06-14
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-25
  • 2021-07-13
相关资源
相似解决方案