读取普通的table或者系统表,都会调用heap_open函数:

/* ----------------
* heap_open - open a heap relation by relation OID
*
* This is essentially relation_open plus check that the relation
* is not an index nor a composite type. (The caller should also
* check that it's not a view or foreign table before assuming it has
* storage.)
* ----------------
*/
Relation
heap_open(Oid relationId, LOCKMODE lockmode)
{
//fprintf(stderr,"++++++++++++++++++++ In heap_open start by process %d....relationId is:%d\n",
      getpid(),relationId);
Relation r; r = relation_open(relationId, lockmode); if (r->rd_rel->relkind == RELKIND_INDEX)
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("\"%s\" is an index",
RelationGetRelationName(r))));
else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("\"%s\" is a composite type",
RelationGetRelationName(r)))); //fprintf(stderr,"++++++++++++++++++++ In heap_open end by process %d\n\n",getpid()); return r;
}

对于普通表而言,RelationId就是在base目录下的某个子目录里面的文件名。

但是对于系统表而言,则不同。
比如 pg_tablespace 的RelationId为 1213(这已经写死在PostgreSQL源代码中),
但是其对应的文件的名称为 12587(对应global/12587文件)。

经过一番测试,发现其对应关系如下:

 pg_default_acl 826
pg_pltemplate 1136
pg_tablespace 1213
pg_shdepend 1214
pg_type 1247
pg_attribute 1249
pg_proc 1255
pg_class 1259
pg_authid 1260
pg_auth_members 1261
pg_database  1262
pg_foreign_server 1417
pg_user_mapping 1418
pg_foreign_data_wrapper 2328
pg_shdescription 2396
pg_aggregate 2600
pg_am 2601
pg_amop 2602
pg_ampro 2603
pg_attrdef 2604
pg_cast 2605
pg_constraint 2606
pg_conversion 2607
pg_depend 2608
pg_description 2609
pg_index 2610
pg_inherits 2611
pg_language 2612
pg_largeobject 2613
pg_namespace 2615
pg_opclass 2616
pg_operator 2617
pg_rewrite 2618
pg_stastic 2619
pg_trigger 2620
pg_opfamily 2753
pg_db_role_setting 2964
pg_largeobject_metadata 2995
pg_extension 3079
pg_foreign_table 3118
pg_collation 3456
pg_enum 3501
pg_seclabel 3596
pg_ts_dict 3600
pg_ts_parser 3601
pg_ts_config 3602
pg_ts_config_map 3603
pg_ts_template 3764

然后,我还可以进一步,观察 ,把上述表格补充完整:

/* ----------------
* relation_open - open any relation by relation OID
*
* If lockmode is not "NoLock", the specified kind of lock is
* obtained on the relation. (Generally, NoLock should only be
* used if the caller knows it has some appropriate lock on the
* relation already.)
*
* An error is raised if the relation does not exist.
*
* NB: a "relation" is anything with a pg_class entry. The caller is
* expected to check whether the relkind is something it can handle.
* ----------------
*/
Relation
relation_open(Oid relationId, LOCKMODE lockmode)
{ fprintf(stderr,"___________________ In relation_open start by process %d\n",getpid()); Relation r; Assert(lockmode >= NoLock && lockmode < MAX_LOCKMODES); /* Get the lock before trying to open the relcache entry */
if (lockmode != NoLock)
LockRelationOid(relationId, lockmode); /* The relcache does all the real work... */
r = RelationIdGetRelation(relationId); fprintf(stderr,"In relation_open ,the relNode is:%d....\n\n",r->rd_node.relNode); if (!RelationIsValid(r))
elog(ERROR, "could not open relation with OID %u", relationId); /* Make note that we've accessed a temporary relation */
if (RelationUsesLocalBuffers(r))
MyXactAccessedTempRel = true; pgstat_initstats(r); fprintf(stderr,"___________________ In relation_open end by process %d\n",getpid()); return r;
}

加入了调试代码后,我可以看到,pg_tablespace 的 RelationId是 1213,而它的对应文件名是 12587。

下面,补充完整:

system table name RelationId FileName
pg_default_acl 826 12642
pg_pltemplate 1136 12591
pg_tablespace 1213 12587
pg_shdepend 1214 12598
pg_type 1247 12442
pg_attribute 1249 12446
pg_proc 1255 12458
pg_class 1259 12465
pg_authid 1260 12450
pg_auth_members 1261 12594
pg_database  1262 12692
pg_foreign_server 1417 12635
pg_user_mapping 1418 12454
pg_foreign_data_wrapper 2328 12631
pg_shdescription 2396 12602
pg_aggregate 2600 12525
pg_am 2601 12505
pg_amop 2602 12509
pg_ampro 2603 12514
pg_attrdef 2604 12469
pg_cast 2605 12549
pg_constraint 2606 12476
pg_conversion 2607 12562
pg_depend 2608 12567
pg_description 2609 12543
pg_index 2610 12489
pg_inherits 2611 12485
pg_language 2612 12518
pg_largeobject 2613 12571
pg_namespace 2615 12558
pg_opclass 2616 12501
pg_operator 2617 12493
pg_rewrite 2618 12528
pg_stastic 2619 12436
pg_trigger 2620 12535
pg_opfamily 2753 12497
pg_db_role_setting 2964 12581
pg_largeobject_metadata 2995 12522
pg_extension 3079 12627
pg_foreign_table 3118 12639
pg_collation 3456 12652
pg_enum 3501 12553
pg_seclabel 3596 12646
pg_ts_dict 3600 12615
pg_ts_parser 3601 12619
pg_ts_config 3602 12608
pg_ts_config_map 3603 12612
pg_ts_template 3764 12623

如果进一步查看,还可以发现:

只有如下几个系统表的对应文件位于 global目录,其余的系统表的对应文件则是base目录下的每个子目录中都有(一个子目录对应一个数据库):

system table name RelationId FileName
pg_pltemplate 1136 12591
pg_tablespace 1213 12587
pg_shdepend 1214 12598
pg_authid 1260 12450
pg_auth_members 1261 12594
pg_database  1262 12692
pg_shdescription 2396 12602
pg_db_role_setting 2964 12581

对PostgreSQL中 pg_各表的RelationId的认识的更多相关文章

  1. PostgreSQL中使用外部表

    1. 安装file_fdw 需要先安装file_fdw,一般是进到PostgreSQL的源码包中的contrib/file_fdw目录下,执行: make make install 然后进入数据库中, ...

  2. PostgreSQL中数据库,表,等对象的oid与对象名的对应关系

    -bash-4.1$ oid2name Password: All databases: Oid Database Name Tablespace--------------------------- ...

  3. PostgreSQL中关于关键字(保留字)在表名和字段名中的应用文件解决

    标识符和关键词 受限标识符或被引号修饰的标识符.它是由双引号(")包围的一个任意字符序列.一个受限标识符总是一个标识符而不会是一个关键字.因此"select"可以用于引用 ...

  4. PostgreSQL 中日期类型转换与变量使用及相关问题

    PostgreSQL中日期类型与字符串类型的转换方法 示例如下: postgres=# select current_date; date ------------ 2015-08-31 (1 row ...

  5. 在PostgreSQL中使用oracle_fdw访问Oracle

    本文讲述如何在PostgreSQL中使用oracle_fdw访问Oracle上的数据. 1. 安装oracle_fdw 可以参照:oracle_fdw in github 编译安装oracle_fdw ...

  6. [转] PostgreSQL学习手册(数据表)

    from: http://www.cnblogs.com/stephen-liu74/archive/2012/04/23/2290803.html 一.表的定义: 对于任何一种关系型数据库而言,表都 ...

  7. Postgresql中临时表(temporary table)的特性和用法

    熟悉Oracle的人,相比对临时表(temporary table)并不陌生,很多场景对解决问题起到不错的作用,开源库Postgresql中,也有临时表的概念,虽然和Oracle中临时表名字相同,使用 ...

  8. Django中的跨表查询,多表查询。

    一:Django中的ORM进行操作. 必须掌握的十三条: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  9. Postgresql中的数据类型大全

    一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字 ...

随机推荐

  1. Java [Leetcode 58]Length of Last Word

    题目描述: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return ...

  2. MYSQL设计方案

    Scale Out:横向扩展,增加处理节点提高整体处理能力Scale Up:纵向扩展,通过提升单个节点的处理能力达到提升整体处理能力的目的 ReplicationMySQL的replication是异 ...

  3. Android手动画柱状图的例子

    效果图如上,网上看到的例子,谨以此文记录一下,以后用到的地方再来翻翻. 核心技术是用Canvas和Paint画长方形. 源码地址:http://download.csdn.net/detail/abc ...

  4. Hibernate管理Session和批量操作

    Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hiber ...

  5. ecshop init.php文件分析

    1.  ecshop init.php文件分析 2.  <?php  3.   4.  /**  5.  * ECSHOP 前台公用文件  6.  * ===================== ...

  6. windows各种程序中文显示乱码又找不到原因时

    我电脑上的各种程序,如xshell,Navicat for MySQL都不正常显示中文,该软件的编码,utf-8,gbk,gb2312来回切换好几回,没一次正常,最好解决办法如下       进入控制 ...

  7. WiFi Test Entity

    项目要结了,总结下每次新版本WiFi需要测试的内容 1 IOT1.1     connect target[Connected];    modify wifi pwd to wrong pwd[Au ...

  8. 酷派8150S(移动定制版)可用的第三方Recovery备份数据、刷机并精简系统内置APK经验

    希望使用的第三方Recovery下载地址: ClockworkMod ROM Manager - Recoveries http://clockworkmod.com/rommanager 适配的型号 ...

  9. C#中常用的字符串加密,解密方法封装,包含只加密,不解密的方法

    //方法一//须添加对System.Web的引用//using System.Web.Security;/// <summary>/// SHA1加密字符串/// </summary ...

  10. ASM中的别名

    在ASM中的别名,是为了方便管理. 在ASM中创建别名,一种是在RDBMS中创建,另外一种是在ASM中创建,区别就是在ASM中创建的别名,在RDBMS中是不可见的. 在RDBMS中创建别名: SQL& ...