建表:
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
已经变成连续的了。