# 第 61 章表访问方法接口定义

本章解释了核心 PostgreSQL 系统和表访问方法,它管理表的存储。除了此处指定的内容之外,核心系统对这些访问方法知之甚少,因此可以通过编写附加代码来开发全新的访问方法类型。

每个表访问方法都由表中的一行描述pg_am系统目录。这pg_am条目指定名称和处理函数对于表访问方法。这些条目可以使用创建访问方法删除访问方法SQL 命令。

必须声明表访问方法处理函数以接受类型的单个参数内部的并返回伪类型table_am_handler.该参数是一个虚拟值,仅用于防止直接从 SQL 命令调用处理程序函数。函数的结果必须是指向类型结构的指针表上午例程,其中包含核心代码使用表访问方法需要知道的所有内容。返回值需要是服务器生命周期,这通常通过将其定义为静态常量全局范围内的变量。这表上午例程struct,也称为访问方法的API结构, 使用回调定义访问方法的行为。这些回调是指向普通 C 函数的指针,在 SQL 级别不可见或不可调用。所有回调及其行为都在表上午例程结构(结构内的注释定义了回调的要求)。大多数回调都有包装函数,这些函数是从表访问方法的用户(而不是实现者)的角度记录的。详情请参阅src/include/access/tableam。H (opens new window)文件

为了实现一个访问方法,实现者通常需要实现一个特定于AM的元组表槽(参见src/include/executor/tuptable。H (opens new window)),它允许访问方法之外的代码保存对AM元组的引用,并访问元组的列。

目前,AM实际存储数据的方式相当不受限制。例如,使用postgres的共享缓冲缓存是可能的,但不是必需的。如果使用了它,使用PostgreSQL的标准页面布局可能是有意义的,如中所述第70.6节.

表访问方法API的一个相当大的限制是,当前,如果AM想要支持修改和/或索引,则每个元组都必须有一个元组标识符(TID),由块号和项目号组成(另请参见第70.6节)。严格来说,没有必要让TID的子部分具有与TID相同的含义,例如:,但如果需要位图扫描支持(可选),则块号需要提供局部性。

为了确保碰撞安全,AM可以使用postgres的沃尔,或自定义实现。如果选择了沃尔通用沃尔记录可以使用,也可以实现一种新型的WAL记录。通用的WAL记录很容易,但意味着更高的WAL数量。实现新型WAL记录目前需要修改核心代码(特别是,src/include/access/rmgrlist。H).

为了以允许在单个事务中访问不同的表访问方法的方式实现事务支持,可能需要与中的机器紧密集成src/backend/access/transam/xlog。C.

任何开发新产品的人表访问方法可以参考现有的目前正在实施src/backend/access/heap/heapam_处理程序。C了解其实施细节。