根据 PostgreSQLL 的 MVCC 机制,在执行 update 命令更新数据时, PG 会在原有基础上复制一份新的复本 tuples 出来,然后在新的 tuples 上进行更新,下面验证下这个过程。
创建测试表
1 |
create table test_59(id integer,name varchar(32)); |
查询表的 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之后才会将老记录清除,这里不再详述。
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/236436.html