探索:PostgreSQL 的 UPDATE 操作

根据 PostgreSQLL 的 MVCC 机制,在执行 update 命令更新数据时, PG 会在原有基础上复制一份新的复本 tuples 出来,然后在新的 tuples 上进行更新,下面验证下这个过程。

创建测试表

1
2
3
4
skytf=> create table test_59(id integer,name varchar(32));  
CREATE TABLE
skytf=> insert into test_59 values (1,'a'),(2,'b'),(3,'c');
INSERT 0 3

查询表的 ctid

1
2
3
4
5
6
7
skytf=> select ctid, * from test_59;  
ctid | id | name
-------+----+------
(0,1) | 1 | a
(0,2) | 2 | b
(0,3) | 3 | c
(3 rows)

备注: ctid 为记录上逻辑标识,ctid 有两个字段组成,第一个字段表示 table 的逻辑 PAGE 编号,第二个字段表示每个逻辑 PAGE 上的第 N 条记录; 例如 ctid =(0,3) 表示这条记录位于这个表的第 0 PAGE 页的第三条记录。

更新记录

更新表中的一条记录,如下:

1
2
skytf=> update test_59 set name='aaa' where id=1;  
UPDATE 1

再次查询表的 ctid

1
2
3
4
5
6
7
8
9
10
11
12
skytf=> select ctid, * from test_59;  
ctid | id | name
-------+----+------
(0,2) | 2 | b
(0,3) | 3 | c
(0,4) | 1 | aaa
(3 rows)

skytf=> select ctid, * from test_59 where id=1;
ctid | id | name
-------+----+------
(0,4) | 1 | aaa

备注:id=1 这条记录的 ctid 由原来的 (0,1) 变成现在的 (0,4) 了,说明在 update 时,是在这条记录的复本上进行 update, 同时老记录标识不可见,的记录依然在PAGE里,VACUUM之后才会将老记录清除,这里不再详述。

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/236436.html

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论