PG中的oid和relfilenode之间的关系
PG中的表由一个relfilenode值,即磁盘上表的文件名(除了外表和分区表)。通常情况下可以在Pg_class表找到这个值,然而也会查考一些表的relfilenode为0.本文介绍这些表relfilenode的内部处理流程。
普通表的relfilenode
PG中创建一个表后,会在系统被pg_class存储它的relfilenode值。下面例子,表创建后,OID和relfilenode都时16808。还可以在磁盘上看到16808文件。
postgres=# create table t2(i int);
CREATE TABLE
postgres=# select oid,relname,relfilenode frompg_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也会改变。下面测试显示了t