PostgreSQL 的 UPDATE 操作


转自 https://postgres.fun/20111022113035.html

根据 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之后才会将老记录清除,这里不再详述。

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM