2017-09-11 91 views
1

我一直在玩postgresql一段时间,这引起了我的注意。什么是postgresql中的“映射关系”。根据该文件,postgresql中的映射关系

当磁盘上的文件的名称是零,它被称为“映射” 关系,其磁盘文件名是由低确定 - 水平状态。

这是一个简单的关系,没有一个固定的OID引用它。它为什么被创建?它有什么意义?或者它与临时表类似? 有人能告诉我这个吗?

回答

1

https://www.postgresql.org/docs/current/static/storage-file-layout.html

此外,对于包括的pg_class本身某些系统目录, pg_class.relfilenode包含零。这些目录的实际文件节点号 存储在较低级别的数据结构中,并且可以使用pg_relation_filenode()函数获得 。

t=# select relfilenode from pg_class where relname = 'pg_class'; 
relfilenode 
------------- 
      0 
(1 row) 

t=# select pg_relation_filenode('pg_class'); 
pg_relation_filenode 
---------------------- 
       12712 
(1 row) 

现在有点野蛮(但用户友好的)的方式,以确保它是文件:

t=# create table very_special_name(i int); 
CREATE TABLE 
t=# CHECKPOINT; --to actually write to disk 
CHECKPOINT 
t=# select oid from pg_database where datname='t'; 
    oid 
---------- 
13805223 
(1 row) 

所以我们检查可读的字符串:

-bash-4.2$ strings /pg/data/base/13805223/12712 | grep very_special 
very_special_name 

新表名称在...

+0

因此,只有映射表映射或用户表也映射? – user4658312

+0

我会这么说。尝试'选择从pg_class其中relfilenode = 0'的relname,看看它的情况是否在你的分区 –

+0

是啊,那个查询的结果在我所有的数据库中只给出了目录表。谢谢 :) – user4658312