背景
社区中某同学提出问题:
某环境磁盘占用空间较大,于是想找到数据目录占用最大的表。使用常规查询找不出来,于是到数据目录下分析filenode,找到3个filenode占了400G。然而根据filenode从pg_class中确找不到对应的relfilenode。
查询方法为:
select oid,relname,relfilenode from pg_class where relfilenode=...
分析
PostgreSQL中的表会有一个RelFileNode值指定这个表在磁盘上的文件名(外部表、分区表除外)。一般情况下在pg_class表的relfilenode字段可以查出这个值,但是有一些特定表在relfilenode字段的查询结果是0,如某些系统表。
另外,对于普通表,将对表执行truncate,vacuum full等操作后,会重写这个表的数据,也会引发这个表relfilenode值的变更。
具体可以参考文章https://blog.youkuaiyun.com/weixin_46199817/article/details/113108402 中的描述。
这意味着,某个对象的Oid和RelFi