我对ctid的理解是,它通过给出page_id和存储特定行/元组的页面中的偏移量来返回行在磁盘上的物理位置。但是当尝试为不同的表获取ctid时,我得到的是相同的ctid。所以我真的很困惑ctid到底返回什么?它不能是磁盘上的“实际”物理位置,因为磁盘上的给定位置只能有一行。下面附上两个不同postgres表中5行的ctid值的图片:
x1c 0d1x的数据
我对ctid的理解是,它通过给出page_id和存储特定行/元组的页面中的偏移量来返回行在磁盘上的物理位置。但是当尝试为不同的表获取ctid时,我得到的是相同的ctid。所以我真的很困惑ctid到底返回什么?它不能是磁盘上的“实际”物理位置,因为磁盘上的给定位置只能有一行。下面附上两个不同postgres表中5行的ctid值的图片:
x1c 0d1x的数据
1条答案
按热度按时间jslywgbw1#
你几乎是正确的-它不是元组的绝对位置,而是它在表中的位置。请参阅doc on system columns:
ctid
行版本在其表中的物理位置。(...)tableoid
包含此行的表的行。(...)在邮政系统中,
tableoid
是建筑物地址,ctid
是楼层和公寓号。ctid
本身并不是全局唯一的,但它们与tableoid
:demo at db<>fiddle组合时是唯一的字符串
| 似表的|ctid|
| --|--|
| 16384 |(0,1)|
| 16384 |(0,2)|
| 16384 |(0,3)|
型
| 似表的|ctid|
| --|--|
| 16387 |(0,1)|
| 16387 |(0,2)|
| 16387 |(0,3)|
您可能需要查看Chapter 73. Database Physical Storage的官方文档。