Author: 义从
社区 PostgreSQL 和 GreenPlum 都提供了读写外部数据源的方法,它们都提供了一套编程接口,用户可以在这上面做二次开发,建立外部数据源和数据库间的数据通道。 本文介绍 PostgreSQL 和 GreenPlum 这部分编程接口的实现和编程方法。结合 RDS 开发的 oss_ext 接口。展示外部数据源接口的能力。
FDW 的全称是 foreign-data wrapper,是一套读写外部数据源的编程接口。它提供了多个回调函数编程接口,开发者可以逐一实现这些接口,封装成动态库,然后加载到内核中使用。 下面逐一介绍下这套编程接口
GetForeignRelSize_function GetForeignRelSize;
返回给数据库对应数据源的规模信息
GetForeignPaths_function GetForeignPaths;
优化器接口,提供对应数据源的查询路径。
GetForeignPlan_function GetForeignPlan;
优化器接口,提供对应数据源的查询计划。
BeginForeignScan_function BeginForeignScan;
执行器接口,外部表扫描开始的准备工作。
IterateForeignScan_function IterateForeignScan;
执行器接口,外部表扫描实现,一次返回一个 tuple slot。
ReScanForeignScan_function ReScanForeignScan;
执行器接口,外部表扫描节点重新开始,重置所有状态参数和内存结构。
EndForeignScan_function EndForeignScan;
执行器接口,外部表扫描节点结束,释放资源。
AddForeignUpdateTargets_function AddForeignUpdateTargets;
构造要更新的外部数据源的目标列信息
PlanForeignModify_function PlanForeignModify;
构造外部数据源修改的(包括insert update delete的)的数据结构
BeginForeignModify_function BeginForeignModify;
执行器接口,数据更新节点的数据准备
ExecForeignInsert_function ExecForeignInsert;
执行器接口,insert 一行数据
ExecForeignUpdate_function ExecForeignUpdate;
执行器接口,update 一行数据
ExecForeignDelete_function ExecForeignDelete;
执行器接口,delete 一行数据
EndForeignModify_function EndForeignModify;
执行器接口,修改结束,释放相关资源
IsForeignRelUpdatable_function IsForeignRelUpdatable;
执行器接口,修改结束,释放相关资源
ExplainForeignScan_function ExplainForeignScan;
展示扫描节点的相关信息
ExplainForeignModify_function ExplainForeignModify;
展示修改数据节点的相关信息
AnalyzeForeignTable_function AnalyzeForeignTable;
分析外部数据的数据分布状况接口
GreenPlum external table 在实现上和 PostgreSQL FDW 完全不同,有自己的特点:
readfunc
按数据块读取数据
writefunc
按数据块写数据
基于上述编程接口,我们开发了一套用于从 oss 导入数据到 GreenPlum 和 PostgreSQL 的插件,性能杠杠的。帮助云上用户更好的使用 RDS 数据库产品。