我对 ctid 的理解是,它通过给出 page_id 和存储特定行/元组的页面中的偏移量来返回磁盘上行的物理位置。但是当尝试获取不同表的 ctid 时,我得到相同的 ctid。所以我真的很困惑 ctid 到底返回什么?它不可能是磁盘上的“实际”物理位置,因为磁盘上的给定位置只能有一行。下面附上两张不同 postgres 表中 5 行的 ctid 值的图片:
你几乎是正确的 - 这不是元组的绝对位置,而是它在表中的位置:
行版本在其表中的物理位置。请注意,虽然 ctid 可用于非常快速地定位行版本,但如果行被 VACUUM FULL 更新或移动,其 ctid 将会更改。因此 ctid 作为长期行标识符是没有用的。应使用主键来标识逻辑行。ctid