• 主键分页和主键重建测试


    建表:

    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

    已经变成连续的了。

  • 相关阅读:
    应用系统数据删除与恢复
    Java设计模式(八)Proxy代理模式
    Java设计模式(七)Decorate装饰器模式
    Java服务器端生成报告文档:使用SQL Server Report Service(SSRS)
    C#生成二维码,裁切边框
    Java ORM Hibernate 入门笔记
    Java JDBC MySQL
    Java JDBC SqlServer
    Java设计模式(六)Adapter适配器模式
    Java设计模式(五)Prototype原型模式
  • 原文地址:https://www.cnblogs.com/lweia/p/3621587.html
Copyright © 2020-2023  润新知