Postgres 系统列在第 5 章中记录。数据定义 > 5.4。系统列。
该页面提到oid
值“是 32 位数量”。该页面对交易标识符也有同样的看法。所以我假设这意味着oid
, tableoid
, xmin
, cmin
,xmax
和cmax
都是 32 位整数。
但这留下了ctid
系统列。
行版本在其表中的物理位置。请注意,尽管 ctid 可用于非常快速地定位行版本,但如果行的 ctid 被 VACUUM FULL 更新或移动,它会发生变化。因此 ctid 作为长期行标识符是无用的。OID,或者更好的用户定义的序列号,应该用于识别逻辑行。
➡ 列的数据类型是ctid
什么?
具体来说,我对 Postgres 10.3 版本感兴趣,但如果它在过去的版本中发生了变化,那将是很高兴知道的。
tid
请参阅手册页,第 8 章。数据类型 > 8.18。对象标识符类型。它解释说数据类型是 Postgres 特定的,称为
tid
.您可能会发现这个类似的问题很有趣:如何将 ctid 分解为页码和行号?
顺便说一句,如果您对
ctid
&的这个话题感兴趣tid
,您可能会对 Postgres 12 的两个新特性感兴趣:(a) OID 降级为普通列,以及 (b) 可插入的表存储/访问方法特性Postgres 12 及更高版本。请参阅Robert Haas 博客、Michael Paquier 帖子、pg 黑客邮件列表中的 zheap 公告、Zheap PG Wiki和pgcon'19 中的 Andres Anarazel youtube 视频。CTID 是
ItemPointer
. 它基本上是指向存储在页面上的元组的指针。请参阅bufpage.h
PostgreSQL 源代码中的标题注释。参考:https ://www.postgresql.org/docs/14/storage-page-layout.html