首页 > 其他分享 >CMU15721 笔记:Project 1 - Foreign Data Wrapper

CMU15721 笔记:Project 1 - Foreign Data Wrapper

时间:2023-09-10 12:33:25浏览次数:65  
标签:FDW 外部 数据源 FOREIGN Wrapper foreign Project fdw Foreign

CMU 15-721 Project 1 - Foreign Data Wrapper

Pre

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

Use

使用 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'
);

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 进行调用。

Procedure

img

img

img

Source Code

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

这个结构体描述了外部数据包裹器

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

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

3.内核提供的创建外部数据源计划节点和数据类型管理的接口
1.提供一个生成路径的方法,用于为外部表生成一个连接路径.(路径是指对于一组基本表进行连接操作的顺序).

2.提供从计划到SQL的接口,生成的SQL会在BeginForeignScan方法中被使用.

3.提供构造访问外部数据源的计划节点接口nodeForeignScan.

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

4.提供从执行器得到tuple,存储为本地tuple的接口.

把nodeForeignScan扫描出来的tuple,存储为postgres所支持的存储方式.

5.内核提供管理网络和内存的函数,用户处理中间数据的存储,和网络连接的管理.

Postgres用于内存管理的palloc0函数.

4.内核中生成执行计划和用执行器执行相关接口
1.与scan相关接口函数,均在用于访问外部数据的执行器代码nodeforeignscan.c中被调用,如图所示:

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

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

Reference

标签:FDW,外部,数据源,FOREIGN,Wrapper,foreign,Project,fdw,Foreign
From: https://www.cnblogs.com/qwerty-ll/p/17480206.html

相关文章

  • 项目管理工具----普加项目管理中间件(PlusProject )入门教程(10):数据加载
    普加项目管理中间件是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。PlusProject提供了加载json数据方式来显示。规定的数据格式如下:{ UID:100, Name:'ProjectName', StartDate:'2007-01-01T08:00:00', Fin......
  • 项目管理工具----普加项目管理中间件(PlusProject )入门教程(11):msProject项目的导入和导
    普加项目管理中间件是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。.net下可以导入xml和.mpp,微软提供了Microsoft.Office.Interop.MSProject.dll,可以将mpp文件转换成xml格式,我们提供了Plusoft.dll对xml文件进行了......
  • 项目管理工具----普加项目管理中间件(PlusProject )入门教程(11):msProject项目的导入和导
    普加项目管理中间件是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。同样普加项目管理中间件提供了导出方法,可以导出XML格式的文件,这个文件可以在微软project中直接打开展示。varwin=newPlusProject.ExportPro......
  • 项目管理工具----普加项目管理中间件(PlusProject )入门教程(12):前锋线
    普加项目管理中间件是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。前锋线,是指从检查时刻的时标点出发,用点划线依次将各项工作实际进展位置点连接而成的折线。通过实际进度前锋线与原进度计划中各工作箭线交点的......
  • 项目管理工具----普加项目管理中间件(PlusProject )入门教程(11):msProject项目的导入和导
    普加项目管理中间件是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。除了上文介绍的加载json数据的方式展示外,更常用的方式是导入。普加项目管理中间件支持导入微软project两种格式的文件,xml和mpp,这里的文件解析都......
  • git 用一个project添加两个远程仓库
    以android的recovery项目为例,目前gitbranch-r中只有A仓库的分支 gitbranch-r m/dev->A/branch_nameA A/master这是因为manifest中的recovery项目配置为:<remotename="A"fetch="ssh://git@git.****.cn/A/"review="gerrit.pt.A.com"/><pro......
  • dotnet 读 WPF 源代码笔记 聊聊 HwndWrapper
    我在阅读WPF源代码,在HwndWrapper的静态构造函数看到了申请了HwndWrapper.GetGCMemMessage这个Windows消息,好奇这个消息是什么功能的。通过阅读WPF源代码和写测试应用,了解到这是一个完全用来内部测试或调试的消息,没有任何业务上的功能在WPF的HwndWrapper的静态构造......
  • Project下载安装-Project官方版-Project最新版 中文版介绍
    Project是由微软公司开发的项目管理软件,首次发布于1984年。该软件归属于项目管理、资源协调和时间表设定等领域,被广泛应用于企业项目管理、工程管理和IT项目开发等方面。本文将向读者介绍Project的特点、功能、适用人群等信息。软件地址:看置顶贴MicrosoftOfficeProject2021软件优......
  • project-下载正版2021project-下载 中文版介绍
    crosoftProject是国际上最为盛行与通用的项目管理软件,凝集了许多成熟的项目管理现代理论和方法,可以帮助项目管理者实现时间、资源、成本的计划、控制,适用于新产品研发、IT、房地产、工程、大型活动等项目类型,crosoftProject可以快速、准确地创建项目计划,而且可以帮助项目经理实现......
  • The specified target project directory xxxx does not exist 报错
    检查generatorConfig.xml中targetProject属性是否为相对路径原因:targetProject属性中的相对路径无法找到   文件路径是由启动类的Workingdirectory+targetProject决定的所以xml文件中的targetProject属性需要,以绝对路径-Workingdirectory路径=相......