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