5.4. 系統列
每一個表都擁有一些由系統隐式定義的系統列。是以,這些列的名字不能像使用者定義的列一樣使用(注意這種限制與名稱是否為關鍵詞沒有關系,即便用引号限定一個名稱也無法繞過這種限制)。 事實上使用者不需要關心這些列,隻需要知道它們存在即可。
-
oid
- 一行的對象辨別符(對象ID)。該列隻有在表使用
建立時或者 default_with_oids 配置變量被設定時才存在。該列的類型為WITH OIDS
(與列名一緻),該類型詳見 第 8.18 節 。oid
-
tableoid
- 包含這一行的表的OID。該列是特别為從繼承層次(見 第 5.9 節 )中選擇的查詢而準備,因為如果沒有它将很難知道一行來自于哪個表。
可以與tableoid
的pg_class
列進行連接配接來獲得表的名稱。oid
-
xmin
- 插入該行版本的事務身份(事務ID)。一個行版本是一個行的一個特别版本,對一個邏輯行的每一次更新都将建立一個新的行版本。
-
cmin
- 插入事務中的指令辨別符(從0開始)。
-
xmax
- 删除事務的身份(事務ID),對于未删除的行版本為0。對于一個可見的行版本,該列值也可能為非零。這通常表示删除事務還沒有送出,或者一個删除嘗試被復原。
-
cmax
- 删除事務中的指令辨別符,或者為0。
-
ctid
- 行版本在其表中的實體位置。注意盡管
可以被用來非常快速地定位行版本,但是一個行的ctid
會在被更新或者被ctid
移動時改變。是以,VACUUM FULL
不能作為一個長期行辨別符。OID或者最好是一個使用者定義的序列号才應該被用來辨別邏輯行。ctid
OID是32位量,它從一個服務于整個集簇的計數器配置設定而來。在一個大型的或者曆時長久的資料庫中,該計數器有可能會出現繞回。是以,不要總是假設OID是唯一的,除非你采取了措施來保證。如果需要在一個表中辨別行,推薦使用一個序列生成器。然而,OID也可以被使用,但是是要采取一些額外的預防措施:
- 如果要将OID用來辨別行,應該在OID列上建立一個唯一限制。當這樣一個唯一限制(或唯一索引)存在時,系統會注意不生成比對現有行的OID(當然,這隻有在表的航數目少于232(40億)時才成立。并且在實踐中表的尺寸最好遠比這個值小,否則将會犧牲性能)。
- 絕不要認為OID在表之間也是唯一的,使用
和行OID的組合來作為資料庫範圍内的辨別符。tableoid
- 當然,問題中的表都必須是用
建立。在PostgreSQL 8.1中,WITH OIDS
是預設形式。WITHOUT OIDS
事務辨別符也是32位量。在一個曆時長久的資料庫中事務ID同樣會繞回。但如果采取适當的維護過程,這不會是一個緻命的問題,詳見
第 24 章。但是,長期(超過10億個事務)依賴事務ID的唯一性是不明智的。
指令辨別符也是32位量。這對一個事務中包含的SQL指令設定了一個硬極限: 232(40億)。在實踐中,該限制并不是問題 — 注意該限制隻是針對SQL指令的數目而不是被處理的行數。同樣,隻有真正 修改了資料庫内容的指令才會消耗一個指令辨別符。
本文轉自PostgreSQL中文社群,原文連結: