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