PostgreSQL中Oid和Relfilenode的映射

本文探讨了PostgreSQL中表的Relfilenode值,特别是对于正常表和特殊Nail表的处理。正常表在创建和操作后,Relfilenode会发生变化。而Nail表如pg_class等在pg_class表中的relfilenode显示为0,实际映射关系存储在pg_filenode.map文件中。通过pg_relation_filenode()和pg_filenode_relation()函数可以进行oid和relfilenode的转化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者李传成
中国PG分会认证专家,瀚高软件资深内核研发工程师
https://zhuanlan.zhihu.com/p/342466054

PostgreSQL中的表会有一个RelFileNode值指定这个表在磁盘上的文件名(外部表、分区表除外)。一般情况下在pg_class表的relfilenode字段可以查出这个值,但是有一些特定表在relfilenode字段的查询结果是0,这个博客中将会探究这些特殊表relfilenode的内核处理。

正常表的Relfilenode

当我们创建一张普通表时,在pg_class系统表里可以查询出其relfilenode,可以看出在表刚刚创建时其oid和relfilenode都是16808,在磁盘上也可以查询到16808这个文件。事实上,这个文件存储了我们向表t2插入的数据。

postgres=# create table t2(i int);
CREATE TABLE
postgres=# select oid,relname,relfilenode from pg_class where relname = 't2';
  oid  | relname | relfilenode 
-------+---------+-------------
 16808 | t2      |       16808
(1 row)

postgres=# \q
movead@movead-PC:/h2/pgpgpg/bin$ ll ../data/base/12835/16808 
-rw-------+ 1 movead movead 0 12月 31 17:11 ../data/base/12835/16808
movead@movead-PC:/h2/pgpgpg/bin$

在我们对一张表执行truncate,vacuum full等操作后,会重写这个表的数据,会引发这个表relfilenode值的变更。如下测试可以看出truncate之后,t2表的relfilenode从16808变为了16811.

postgres=# truncate t2;
TRUNCATE TABLE
postgres=# select oid,relname,relfilenode from pg_class where relname = 't2';
  oid  | relname 
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值