天天看點

PostgreSQL 10.1 手冊_部分 II. SQL 語言_第 5 章 資料定義_5.4. 系統列

5.4. 系統列

每一個表都擁有一些由系統隐式定義的系統列。是以,這些列的名字不能像使用者定義的列一樣使用(注意這種限制與名稱是否為關鍵詞沒有關系,即便用引号限定一個名稱也無法繞過這種限制)。 事實上使用者不需要關心這些列,隻需要知道它們存在即可。

oid

一行的對象辨別符(對象ID)。該列隻有在表使用

WITH OIDS

建立時或者 default_with_oids 配置變量被設定時才存在。該列的類型為

oid

(與列名一緻),該類型詳見 第 8.18 節

tableoid

包含這一行的表的OID。該列是特别為從繼承層次(見 第 5.9 節 )中選擇的查詢而準備,因為如果沒有它将很難知道一行來自于哪個表。

tableoid

可以與

pg_class

oid

列進行連接配接來獲得表的名稱。

xmin

插入該行版本的事務身份(事務ID)。一個行版本是一個行的一個特别版本,對一個邏輯行的每一次更新都将建立一個新的行版本。

cmin

插入事務中的指令辨別符(從0開始)。

xmax

删除事務的身份(事務ID),對于未删除的行版本為0。對于一個可見的行版本,該列值也可能為非零。這通常表示删除事務還沒有送出,或者一個删除嘗試被復原。

cmax

删除事務中的指令辨別符,或者為0。

ctid

行版本在其表中的實體位置。注意盡管

ctid

可以被用來非常快速地定位行版本,但是一個行的

ctid

會在被更新或者被

VACUUM FULL

移動時改變。是以,

ctid

不能作為一個長期行辨別符。OID或者最好是一個使用者定義的序列号才應該被用來辨別邏輯行。

OID是32位量,它從一個服務于整個集簇的計數器配置設定而來。在一個大型的或者曆時長久的資料庫中,該計數器有可能會出現繞回。是以,不要總是假設OID是唯一的,除非你采取了措施來保證。如果需要在一個表中辨別行,推薦使用一個序列生成器。然而,OID也可以被使用,但是是要采取一些額外的預防措施:

  • 如果要将OID用來辨別行,應該在OID列上建立一個唯一限制。當這樣一個唯一限制(或唯一索引)存在時,系統會注意不生成比對現有行的OID(當然,這隻有在表的航數目少于232(40億)時才成立。并且在實踐中表的尺寸最好遠比這個值小,否則将會犧牲性能)。
  • 絕不要認為OID在表之間也是唯一的,使用

    tableoid

    和行OID的組合來作為資料庫範圍内的辨別符。
  • 當然,問題中的表都必須是用

    WITH OIDS

    建立。在PostgreSQL 8.1中,

    WITHOUT OIDS

    是預設形式。

事務辨別符也是32位量。在一個曆時長久的資料庫中事務ID同樣會繞回。但如果采取适當的維護過程,這不會是一個緻命的問題,詳見

第 24 章

。但是,長期(超過10億個事務)依賴事務ID的唯一性是不明智的。

指令辨別符也是32位量。這對一個事務中包含的SQL指令設定了一個硬極限: 232(40億)。在實踐中,該限制并不是問題 — 注意該限制隻是針對SQL指令的數目而不是被處理的行數。同樣,隻有真正 修改了資料庫内容的指令才會消耗一個指令辨別符。

本文轉自PostgreSQL中文社群,原文連結: