postgres FDW(foreign data wrapper),是专门用来访问外部存储的机制。统一将所有的外部存储访问都以外部表的方式进行访问。对于执行器来说,都是调用统一的存储访问接口。对执行器和优化器是屏蔽具体的访问介质的。
不论是内部和外部存储介质,要通过查询计划进行访问,都是以表扫描的形式接入执行计划的。需要在优化器和执行器阶段实现对应的功能接口。主要参与执行器计划的接口如下:
优化器阶段:
query_planner
make_one_rel
set_base_rel_sizes
set_base_rel_pathlists
create_plan
create_scan_plan
执行器阶段:
execute_plan
begin_scan
execute_scan
end_scan
在优化器阶段,产生对应的执行计划,执行器根据执行计划进行执行即可,执行阶段为三段式,begin,execute和end。外表和内表在这里是相同的,每个阶段的具体功能如下:
优化器阶段
1、表大小计算,行数,宽度,页面数等
2、路径生成和代价计算
3、执行计划创建
执行阶段 :
1、beginScan 初始化数据访问条件,内表打开对应的数据文件,构建tuple描述等 外表需要建立和外部存储的连接
2、executeScan 内表行级读取数据 外表批量加载数据,行级返回
3、endScan 内表清理文件,描述等 外表关闭连接
对于外表的访问:
1、begin阶段,获取外部存储的链接信息,并建立链接
2、execute阶段,访问该链接并获取文件列表,逐行数据进行读取和解析数据,转换为内核可识别格式
3、end阶段,清理链接
对应postgres FDW的接口如下
使用者只需要实现上述对应的接口,将对外部数据的连接,读取,格式转换等操作放在执行器的三阶段中,即可方便的实现对外部数据的访问,postgres通过FDW实现了很好的外部数据抽象机制,所有的外部数据类型在数据库内核中都被当做foreign scan来进行,屏蔽掉了具体的连接方式和数据转换细节,非常方便易用。