postgresql 为什么Postgres在多个表中为不同的行返回相同的ctid值?

3z6pesqy  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

我对ctid的理解是,它通过给出page_id和存储特定行/元组的页面中的偏移量来返回行在磁盘上的物理位置。但是当尝试为不同的表获取ctid时,我得到的是相同的ctid。所以我真的很困惑ctid到底返回什么?它不能是磁盘上的“实际”物理位置,因为磁盘上的给定位置只能有一行。下面附上两个不同postgres表中5行的ctid值的图片:
x1c 0d1x的数据

jslywgbw

jslywgbw1#

你几乎是正确的-它不是元组的绝对位置,而是它在表中的位置。请参阅doc on system columns
ctid行版本在其表中的物理位置。(...)
tableoid包含此行的表的行。(...)
在邮政系统中,tableoid是建筑物地址,ctid是楼层和公寓号。
ctid本身并不是全局唯一的,但它们与tableoiddemo at db<>fiddle组合时是唯一的

create table a (a int);
create table b (b int);
insert into a select generate_series(1,3) returning tableoid,ctid;

字符串
| 似表的|ctid|
| --|--|
| 16384 |(0,1)|
| 16384 |(0,2)|
| 16384 |(0,3)|

insert into b select generate_series(1,3) returning tableoid,ctid;


| 似表的|ctid|
| --|--|
| 16387 |(0,1)|
| 16387 |(0,2)|
| 16387 |(0,3)|
您可能需要查看Chapter 73. Database Physical Storage的官方文档。

相关问题