转自 https://postgres.fun/20111022113035.html
根据 PostgreSQLL 的 MVCC 机制,在执行 update 命令更新数据时, PG 会在原有基础上复制一份新的复本 tuples 出来,然后在新的 tuples 上进行更新,下面验证下这个过程。
创建测试表
1 |
|
查询表的 ctid
1 |
skytf=> select ctid, * from test_59; |
备注: ctid 为记录上逻辑标识,ctid 有两个字段组成,第一个字段表示 table 的逻辑 PAGE 编号,第二个字段表示每个逻辑 PAGE 上的第 N 条记录; 例如 ctid =(0,3) 表示这条记录位于这个表的第 0 PAGE 页的第三条记录。
更新记录
更新表中的一条记录,如下:
1 |
skytf=> update test_59 set name='aaa' where id=1; |
再次查询表的 ctid
1 |
skytf=> select ctid, * from test_59; |
备注:id=1 这条记录的 ctid 由原来的 (0,1) 变成现在的 (0,4) 了,说明在 update 时,是在这条记录的复本上进行 update, 同时老记录标识不可见,的记录依然在PAGE里,VACUUM之后才会将老记录清除,这里不再详述。
最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!