CMU15721 笔记:Project 1 - Foreign Data Wrapper

CMU 15-721 Project 1 - Foreign Data Wrapper

介绍

2003 年,SQL 标准中增加了一个访问远程数据的规范,称为外部数据的 SQL 管理(SQL/MED)。从 9.1 版开始,PostgreSQL 就开始开发这个特性来实现 SQL/MED 的一部分。在 SQL/MED 中,远程服务器上的表称为外部表。PostgreSQ L 的外部数据包裹器(FDW)使用 SQL/MED 来管理类似于本地表的外部表。

使用

使用 FDW 的核心就在于使用外部表 FOREIGN TABLE。根据 SQL/MED 标准需要在 PG 端依次创建以下几个数据库对象:

  1. 使用 CREATE EXTENTSION 向 PG 安装某个数据源的 FDW 扩展。
  2. 使用 CREATE FOREIGN DATA WRAPPER 语句创建该数据源的 FDW 对象。
  3. 使用 CREATE SERVER 语句创建该数据源的服务器对象。
  4. 使用 CREATE USER MAPPING 语句创建外部数据源用户与 PG 用户的映射关系(这一步是可选的,比如外部数据源根本没有权限控制时,也就无需创建 USER MAPPING 了)。
  5. 使用 CREATE FOREIGN TABLE 语句创建外部表。
  6. 使用 SELECT 语句按照访问普通表的方式访问外部表,如果该数据源支持写操作且它的 FDW 也已实现支持写操作的相关接口,则也可以使用INSERTUPDATEDELETE 语句去更新外部表。

FDW 创建语法

---0 创建远端数据源外部数据包裹器
create extension postgres_fdw;
grant usage on foreign data wrapper postgres_fdw to u1;

---1
create foreign data wrapper postgres_fdw;
drop foreign data wrapper postgres_fdw;

---2
CREATE SERVER foreign_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '8.8.8.8', port '1234', dbname 'testdb');

---3
CREATE USER MAPPING FOR public
SERVER foreign_server
OPTIONS (user 'dbuser', password '123456');

---4
create foreign table foreign_table(col1 int,col2 int)
server foreign_server options(schema_name 'public', table_name 'test_table');

---5
select * from foreign_table;

---6 创建文件外部数据包裹器

CREATE EXTENSION IF NOT EXISTS file_fdw;
CREATE SERVER IF NOT EXISTS file_fdw_server FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE IF NOT EXISTS file_table
(
    c1       varchar,
    c2       int,
    c3       int
) SERVER file_fdw_server OPTIONS
(
    filename '/file',
    tablename 'file_tale'
);

执行 1 处的 SQL 语句,本质是向 postgres 中定义一个用C语言编写的 udf 函数,这个函数就是用户编写的 postgres_fdw.c 中的必须要实现的 postgres_fdw_handler 函数,在这个函数中用户把自己实现的 7 个基本函数注册到 fdwroutine 结构体对象的各个字段中。这样内核中就保存了这7个函数。

FDW 所用的数据结构

使用 DDL 语法定义数据对象。

1. FOREIGN DATA WRAPPER 对象

该对象的实质是向 PG 注册了某个数据源的 FDW 所实现的两个自定义函数——该 FDW 所实现的所有接口的注册函数(在CREATE FOREIGN DATA WRAPPER语句中称为 HANDLER )以及该 FDW 的所支持的选项验证函数(在CREATE FOREIGN DATA WRAPPER语句中称为 VALIDATOR )。 系统表 pg_proc(保存所有自定义函数的元数据) 中,且两者的 OID 以及该 FOREIGN DATA WRAPPER 对象的名称与 OID 一同被保存至系统表 pg_foreign_data_wrapper 中。HANDLER 的作用是将该 fdw 实现的一系列 fdw 回调函数的地址打包返回给 PG,从而使 PG 之后访问外部表时可以调用这些访问外部数据的函数。而所谓的 fdw 回调函数则是指 PG 手册所提及的下述接口的实现。
img

2. FOREIGN SERVER 对象

表示的是外部数据源的数据库对象(比如可以在 CREATE SERVER 时通过选项指定数据库所在服务器的 IP 地址等信息)。FOREIGN SERVER 对象被创建后,相关的元数据被保存在系统表 pg_foreign_server。

3. FOREIGN TABLE对象

将外部数据源的数据组织为表的形式,这样的表就被称作为外部表。当外部表对象被创建后,它与 PG 中的普通表一样,元数据都会被保存在系统表 pg_class 中,只是它的 relkind 字段会用 f 进行标识。同时,该表在也会在系统表 pg_foreign_table 被保存一条记录,它存储了该表在 pg_class 的 OID 与该表所属的 FOREIGN SERVER 的 OID 的对应关系。

FDW 所使用的回调函数

一个 FDW 的实现的核心就是实现一组回调函数,从而在查询外部表对象的 SQL 的执行过程中可以将运行逻辑切换至自定义的扩展代码中,进而遵照 PG 的内部机制实现对外部数据源的访问。
img
这些回调函数都是由 PG 的 OptimizerExecutor 进行调用。

相关流程图

img

img

img

pg 相关代码

对于一个外部数据源而言,只需要实现了上述的 7 个回调函数,就可以支持 PG 对于该外部数据源,以通用的 SQL 语句实现简单的查询功能。当然,如果要真的尝试去实现这些回调函数,还是需要通过 PG 的一些专门面向 FDW 提供的接口来与 PG 进行交互。

fdwapi.h 定义了内核与数据包裹器相关的接口和数据结构。

foreign.h 文件,提供了用于描述包装器的数据结构,包括ForeignDataWrapper,ForeignServer,UserMapping,ForeignTable,以及获得这些对象的方法。这些结构里主要存储了该对象在 postgres中的 oid,以及描述这些结构名字的字符信息。

foreign.c 文件,该文件定义了所需的结构体,在 foreign.c 文件中,提供了与 FdwRoutine 数据结构相关接口的实现。主要功能是将内核里各个数据对象分别放到 ForeignDataWrapper,ForeignServer,UserMapping, ForeignTable,FdwRoutine 这些结构体的对象中,也就是给这些结构体的对象成员赋值。

allpaths.c 和 createplan.c 与计划有关的接口函数,会在优化器相关的文件中被调用。

nodeforeignscan.c 提供构造访问外部数据源的计划节点接口,与scan相关接口函数,均在用于访问外部数据的执行器代码 nodeforeignscan.c 中被调用

palloc0 函数 postgres 用于内存管理的函数。

create_foreignscan_path :提供一个生成路径的方法,用于为外部表生成一个连接路径(路径是指对于一组基本表进行连接操作的顺序)。

img

initStringInfo(sql) : 生成用于外部数据源执行的 sql。

make_foreignscan :提供构造 nodeForeignScan 访问外部数据源的计划 node 接口,fdw 用户所写代码得到一些信息,内核提供一个构造用于访问外部数据源的 node 的方法,用这些信息构造一个 node,并返回给查询优化器模块。

img

TupleTableSlot *slot 表中的 tuple,从计划上得到的 tuple,将该 slot 字段所有字段填满,用于完成查询。

Reference

posted on   LambdaQ  阅读(292)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示