共勉之~数据库在进行delete,drop,truncate之后 什么进行了变化?

10 篇文章 0 订阅
4 篇文章 0 订阅

日常中我们常会进行删除数据库中某一条记录或者某一张表,那么他们在底层是进行了什么操作呢?

一个数据页中的记录被删除后,除与此数据页对应的PFS数据页以外,发生变化的只是页头数据和页尾的偏移量数据,数据页中的数据部分不会发生变化
页头中变化的是:此页的空闲空概念的m_freeCnt会变大
页尾:对应的行偏移量设置为0
数据部分不发生变化

未附加条件的delete与truncate命令都会把表中的记录清空,但是两者机制完全不同

delete操作是普通的DML操作,执行delete操作清空表中的记录后,以及PFS(页自由空间)数据页中对应于这些数据页的相关字节,即被删除的记录所在的槽地址修改为0,PFS数据页中对应于此堆表数据页的相应字节的前3个位(bit0,bit1,bit2)都设置为0.
delete操作,重做日志中会记录所有的被删除的数据,若被删除的数据量很大,则其产生的重做日志数据量也很大。

truncate操作是DDL语句,执行truncate操作只是把表占用的空间释放,只需要修改GAM SGAM数据页中与此表相关的位图数据以及修改此表的IAM数据页中的相关位图数据,truncate操作不会修改堆表数据页中的任何数据,这些数据页释放出来后,可以再分配给其他数据库对象,其原来的数据将被直接覆盖,在重做日志文件中只是记录上述这些操作,而不记录被删除的数据。日志数据一般很少。通过修改这些空间管理位图,释放掉表的数据空间,这些释放出来的空间可以再分配给其他数据库对象(如表,索引等),原来的数据会被覆盖。

drop table操作的作用是从数据库中把表删除,只是修改GAM SGAM数据页中与此表相关的位图数据,在数据字典基层中把属于被删除表的信息清除,drop会在系统基表里把此表的信息删除。表被drop后,数据空间被释放,释放的空间会分配给其他对象重用,原来的表数据会被覆盖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值