主键分页和主键重建测试

建表:

create table test

(id int primary key,

aa char(10) default '1+1')

现在的状态。

灌入数据:

declare @id int

set @id=10

while @id<1000000

begin

insert into test(id)

select @id

set @id=@id+10

end

然后观察状态

总共占用了289页,使用了287页。

可以看出来,其实表在页占用上并不是连续的。

然后找一个单独的页看

以(1:1120)为例

可以看出来它前一页是1:1119后一页是1:1121,有352行记录,第一行249,930,最后一行253,440(中间差值3510)。其中id(int 4个字节) = 00.DE 03 00,aa(char10 字节)= 31 2B 31 20 20 20 20 20 20 20

开始测试主键分页

找到第110行数据:

id=251030

然后让我们记录一下它的数据图像:

然后修改数据

insert into test(id)

select 251035

然后找到1:1120

看到它又4025个字节是空字节了,下一页也变成1:366,行数为177行数据。

找到251030看一下。

对比之前,发现没有?周围数据没有改变,从详细里看

字节是从2406-2426

然后我们看看新加进去的251035

可以算出来一页有8192个字节,正常给一页7488个字节,所以新进的数据并没有写入251030后面,而是写在了最后那部分。

然后在看看分页的情况:

现在这个页的最后一个数据是251,680,(之前是253,440)

再把具体的数据看一下:

然后我们看被分出去的那页1:366

从id=251690开始,行数176行。

然后最后一行:

页进行了拆分。

然后看一下251690的详细数据图像:

然后再看一下之前251680的详细数据图像:

所以分页的时候,数据并没有清理,

然后再测试一下插入新数据251685

insert into test(id)

select 251685

然后再看一下1:1120,找到251685

发现它并没有接着251680下面的字节写,而是从页最后写入。

然后再插入251683,看看情况

发现是从最后写入,中间空页还是没有重用,可能是页还有空间,所以没有重用?

开始测试主键重建

先看一下现在的页分布

最后页为1:1151

中间空白也是从1:368 --- 1:1055

开始重建主键:

alter table test drop CONSTRAINT PK__test__3213E83F0519C6AF

 

ALTER   TABLE   dbo.test   ADD   CONSTRAINT 

  PK_test   PRIMARY   KEY   CLUSTERED   

  ( 

  ID

  )   ON   [PRIMARY]

然后看到数据页是从1:368 到 1:823

过去的数据页完全没有使用。然后在看一下251680所在的数据页:

和251683

已经变成连续的了。

原文地址:https://www.cnblogs.com/lweia/p/3621587.html