PostgreSQL 外部表
1 背景知识
1.1 FDW 是什么?
1、FDW (foreing Data Wrappers)外部数据封装器。
2、外部异构的数据库进行交互。
3、用于数据迁移。
4、支持多表链接统计计数。
1.2 FDW 发展历史
Version | Description |
---|---|
9.3 | postgres_fdw module is released. |
9.6 | Consider performing sorts on the remote server. |
9.6 | Consider performing joins on the remote server. |
9.6 | When feasible, perform UPDATE or DELETE entirely on the remote server.(只是针对pg ,Oracle 改不了 |
9.6 | Allow the fetch size to be set as a server or table option. |
10 | Push aggregate functions to the remote server, when possible . (Oracle 不支持) |
1.3 FDW 出现死锁
FDW 不会检测死锁,因为无法分布式锁机制是缺失的。
2 FDW原理
2.1 FDW SQL 执行步骤
- Parser解析器: 解析后生成解析树。
- Analyze/Analyser 分析器:根据语法树解析后生成查询树。
- 根据
pg_catalog.pg_class
和pg_catalog.pg_foreign_table
在这个步骤去判断是否是外部表。 - 根据上面的信息,生成查询树。
- 根据
- Rewriter 重写器:根据查询树重写语句。
- Planner 规划器 :生成执行计划。
- 根据
pg_catalog.pg_foregin_server
和pg_catalog.pg_user_mapping
去判断表存在哪里 - 发送重写后的语句到remote 服务器生成执行计划。
- 获得
remote server SQL
执行的代价。目的是为了获得最佳的执行计划。(是在本地执行数据处理,还是remote
执行数据处理)。
。
- 根据
- 执行器:根据执行计划进行执行,发送执行语句到
remote
,返回数据。
执行计划的产生,需要判断在local 执行,还是在remote 执行。
- case1:remote server 将数据传回本地后再处理。
- case2: remote server 处理完之后再传回local。
3 FDW 单表查询
3.1 PG 9.5 以前
3.1.1 FDW 单表查询
3.1.2 FDW 后台执行原理
- (5-1)使用(REPEATABLE READ )启动事务
- (5-2)声明一个游标
- (5-3)绑定游标变量
- (5-4)执行游标
- (5-5)获取数据(每次100条)
- (5-6) 返回数据
- (5-7)关闭游标
- (5-8)提交事务
3.2 PG 9.6 以后
3.2.1 FDW 单表查询
3.2.2 后台执行原理
- (5-1)使用(REPEATABLE READ )启动事务
- (5-2)生成执行计划
- (5-3)声明一个游标
- (5-4)获取数据(每次100条)
- (5-5) 返回数据
- (5-6)关闭游标
- (5-7)提交事务