接上期,没说完的 Vacuum ,我们的继续说说PostgreSQL 的某些原理

首先我们创建一个表格

PostgreSQL Vacuum again!

在创建完表后,可以参看表的整体列包含隐藏列

PostgreSQL Vacuum again!tong

PostgreSQL Vacuum again!

 tableoid 列是承担表是否有继承方面的关系确认

 xmin 用于表示这一行的事务ID  (我们这里插入一行数据,并且查看这行数据)

PostgreSQL Vacuum again!

然后我们查看当前的事务XID,已经是已经使用的XID +1 

PostgreSQL Vacuum again!

再次插入数据,在查询XID ,说明这个xmin是自增的一个数值

PostgreSQL Vacuum again!

而xmax 是代表这行的事务,终止的事务号,详情见图,我们删除了这行,所以就有了xmax 的号码

PostgreSQL Vacuum again!

而如果我们不删除,我们更新这行,则只会增长xmin 的号码

PostgreSQL Vacuum again!

而我们如果批量的插入数据则xmin的数字是一致的

PostgreSQL Vacuum again!

这时我们删除从 4 到 10 的记录行

PostgreSQL Vacuum again!

那我们的记录到底怎么样了,我们通过 pageinspact 来查看,蓝色区域就是我们插入的4-10 的数据,并且已经删除了,英文后面有t_xmax

PostgreSQL Vacuum again!

当然这里还有update的事情,这里就略过,这里一句带过,update 的想当于 delete insert 的操作。

而cmin cmax 的意思,当我们以事务的模式来插入数据时,cmin cmax会根据插入的顺序,进行相关数字的填充

PostgreSQL Vacuum again!

PostgreSQL Vacuum again!

此时我们通过事务的方式删除3条数据

在当前事务不commit 的情况下,我们打开另一个session去查看当前的状态,对比当前session的状态

当前的session 

PostgreSQL Vacuum again!

其他session

PostgreSQL Vacuum again!

以上操作,其实包含着POSTGRESQL 的 MVCC 和 isolation 的部分原理。

这是表中的页存储是下面截图的样子

PostgreSQL Vacuum again!

而当我们在执行了清理的命令后,数据页面变成下面的样子。过期的数据已经被清空。

PostgreSQL Vacuum again!

待续....

PostgreSQL Vacuum again!

相关文章: