PostgreSQL的CTID

zchbaby2000發表於2023-02-18


PostgreSQL的CTID和Oracle的ROWID 類似.
CTID欄位存在於PostgresSQL表中,它對於表中的每條記錄始終是唯一的。 它表示資料的物理位置。
我們來建立一個簡單的表來驗證一下上述概念.

dump=# CREATE TABLE events(id SERIAL);
CREATE TABLE
dump=# INSERT INTO events SELECT generate_series(1,10);
INSERT 0 10
dump=# select ctid,* from events;
 (0,1)  |  1
 (0,2)  |  2
 (0,3)  |  3
 (0,4)  |  4
 (0,5)  |  5
 (0,6)  |  6
 (0,7)  |  7
 (0,8)  |  8
 (0,9)  |  9
 (0,10) | 10

這裡的CTID第一個值(0,1),第一個0代表頁碼,第二個1代表行號。

dump=# delete from events where id=1;
DELETE 1
dump=# select ctid,* from events ;
 (0,2)  |  2
 (0,3)  |  3
 (0,4)  |  4
 (0,5)  |  5
 (0,6)  |  6
 (0,7)  |  7
 (0,8)  |  8
 (0,9)  |  9
 (0,10) | 10
dump=# insert into events values(1);
INSERT 0 1
dump=# select ctid,* from events ;
 (0,2)  |  2
 (0,3)  |  3
 (0,4)  |  4
 (0,5)  |  5
 (0,6)  |  6
 (0,7)  |  7
 (0,8)  |  8
 (0,9)  |  9
 (0,10) | 10
 (0,11) |  1

刪除了以後,重新insert被刪除的行,會發現此行放在0頁的最後一行

dump=# update events set id=12 where id=2;
UPDATE 1
dump=# select ctid,* from events ;
 (0,3)  |  3
 (0,4)  |  4
 (0,5)  |  5
 (0,6)  |  6
 (0,7)  |  7
 (0,8)  |  8
 (0,9)  |  9
 (0,10) | 10
 (0,11) |  1
 (0,12) | 12


更新了以後,會發現被更新的行放在0頁的最後一行

dump=# vacuum events;
VACUUM
dump=# select ctid,* from events ;
 (0,3)  |  3
 (0,4)  |  4
 (0,5)  |  5
 (0,6)  |  6
 (0,7)  |  7
 (0,8)  |  8
 (0,9)  |  9
 (0,10) | 10
 (0,11) |  1
 (0,12) | 12

vacuum操作並不改變ctid值

dump=# vacuum full events;
VACUUM
dump=# select ctid,* from events ;
 (0,1)  |  3
 (0,2)  |  4
 (0,3)  |  5
 (0,4)  |  6
 (0,5)  |  7
 (0,6)  |  8
 (0,7)  |  9
 (0,8)  | 10
 (0,9)  |  1
 (0,10) | 12
dump=#


vacuum full操作使得資料被重新分佈,ctid的值被reset




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/725820/viewspace-2935830/,如需轉載,請註明出處,否則將追究法律責任。

相關文章