为何PostgreSQL在多张不同表中返回相同的ctid值?
关于PostgreSQL中ctid的正确理解
你对ctid的核心误解在于把它当成了磁盘全局的物理位置,实际上它是表内的局部物理标识符,具体细节如下:
- ctid的
(page_id, 偏移量)是相对于当前表的存储文件而言的,并非磁盘全局的绝对地址。PostgreSQL会为每个表生成独立的存储文件(路径大致为$PGDATA/base/[数据库OID]/[表OID]),每个表的页号都从0开始单独计数。所以不同表出现相同的ctid,只是各自表文件里的对应位置,对应完全不同的磁盘存储点。 - ctid的作用是快速定位当前表内的元组,比如执行
SELECT * FROM table WHERE ctid = '(0,1)'能直接找到该表第0页的第一个元组,但这个值仅在当前表内有效,跨表没有意义。 - 注意:ctid并非固定不变,当执行VACUUM FULL、UPDATE(PostgreSQL的UPDATE是写入新元组并标记旧元组失效)等操作时,元组的物理位置会发生变化,ctid也会随之改变,因此绝对不能用ctid作为行的永久唯一标识(应该使用主键)。
内容的提问来源于stack exchange,提问作者Marco Polo
相关产品推荐
相关产品推荐

