深入理解缓冲区(九)

4.1.4.3 内外存地址是如何映射的

1 缓存对应的内外存的映射关系:

typedef struct buftag

{

RelFileNode rnode; /* physical relation identifier */ // 数据库对象的位置标识,具体说明见下

ForkNumber forkNum; // 可以查看“relpathbackend”函数,理解其所起的地址映射作用

BlockNumber blockNum; /* blknum relative to begin of reln */

} BufferTag;

2 数据库、表空间、和对象(主要是表对象)的对应关系,构成了内存和数据库对象的映射。

typedef struct RelFileNode

{

Oid spcNode; /* tablespace */ //表空间,本身是一个物理存储的概念,每个表空间的id与其具体的数据文件对应,这样使得缓存块可以和数据文件对应

Oid dbNode; /* database */

Oid relNode; /* relation */

} RelFileNode;

在这个结构中,注意,成员relNode,很重要,是数据和数据库对象映射的重要链条。

GetNewRelFileNode函数的如下代码:

/* Generate the OID */

if (pg_class)

rnode.node.relNode = GetNewOid(pg_class);

else

rnode.node.relNode = GetNewObjectId();

3 数据对象和数据的映射关系:pg_class.h

在pg_class.h文件中,有一列,信息如下:

int4 relpages; /* # of blocks (not always up-to-date) */

标识了本行所表示的对象的具体位置(在数据文件中的具体位置)。

而pg_class系统表,存放了数据库对象(表、视图、序列等)的元信息,本表隶属于具体的数据库(即系统表是局部的,每个数据库都有一份;有的系统表是全局的,全系统只有一份如pg_database)。

有了如上三种信息,即可以串联起数据库对象、内存(缓存)、外存间的映射关系,即可知晓内外存地址是如何映射的了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值