轉自 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等,涵蓋大量實戰用例!