sqlserver 堆表数据删除、修改及空间重用

一、 delete对数据页内容的影响

  1. 被删记录所在数据页中对应的偏移量会被重置为0
  2. 被删记录所在数据页页头中记录空闲空间大小会相应增加(m_freeCnt,用DBCC PAGE命令看),但数据页中空闲空间不会合并
  3. PFS数据页中对应被删记录的数据页空间使用率数据一般会变化
  4. 对应此堆表的IAM、GAM、SGAM数据页内容不变

二、 被删数据所占空间的重用

  1. 新加记录会优先占用数据页中现有空闲空间(现有空闲空间是指m_freeData之后的空间,类似Oracle高水位线以上的空间)
  2. 如果现有空闲空间不够插入一行记录,而包括被删记录所占空间则可以容纳新记录时,数据页中数据会重新组织排列,被删记录所占空间会与现有空闲空间合并,新加记录将存储到合并后的空闲空间中。
  3. 如果合并后还是不够,sqlserver会将新记录插入另一个有足够空间的数据页中,而不重新组织改数据页空闲空间

三、 update后的空间重用

与delete非常像(类似delete后再insert)

  1. 若被update后记录未变长:更新后记录存在原位置
  2. 若被update后记录变长:
  • 原记录标记为删除,新记录会优先占用数据页中现有空闲空间
  • 原记录标记为删除,如果现有空闲空间不够插入一行记录,而包括被删记录所占空间则可以容纳新记录时,数据页中数据会重新组织排列,被删记录所占空间会与现有空闲空间合并,新记录将存储到合并后的空闲空间中。
  • 原记录标记为删除,如果合并后还是不够,sqlserver会将新记录插入另一个有足够空间的数据页中,而不重新组织改数据页空闲空间。在记录的原存储位置留下一个指向新位置的指针(forwarding记录),被移出的记录称为forwarded记录

四、无条件的delete、truncate、drop table

1. 无条件的delete

  • DML操作,清空表中记录,不影响表结构及索引、约束等
  • 释放表占用空间(表上无非聚集索引,否则不会释放空间)
  • 被删记录所在数据页中对应的偏移量会被重置为0
  • 被删记录所在数据页页头中记录空闲空间大小会相应增加(m_freeCnt)
  • PFS数据页中对应被删记录所在的槽地址会改为0,对应于此堆表数据页相应字节的前3个位都设置为0
  • 对应此堆表的IAM、GAM、SGAM数据页内容不变
  • 重做日志中会记录所有被删数据,产生的量与删除量有关

2. truncate

  • DDL操作,清空表中记录,不影响表结构及索引、约束等
  • 修改对应此堆表的IAM、GAM、SGAM数据页
  • 不会修改堆表数据页中的任何数据,这些数据页释放后可以再分配给其他数据库对象,原来的数据直接被覆盖
  • 重做日志只记录上述操作,产生的量很少

3. drop table

  • 从数据库中删除表,影响表结构及索引、约束等
  • 修改对应此堆表的IAM、GAM、SGAM数据页
  • 清除数据字典基表中关于该表的信息

 

参考:《sqlserver 2008数据库技术内幕》

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值