AnalyticDB for PostgreSQL 6 新特性解析 - FDW

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: ADBPG v6.0版本新特性 -- FDW

AnalyticDB for PostgreSQL 6 新特性解析 - FDW

随着AnalyticDB for PostgreSQL 6(下文简称 ADBPG v6)发布公测,ADBPG v6内核进入PostgreSQL 9.4时代,而PG内核的升级给ADBPG带来更多新的特性,本文简要解析Foreign Data Wrapper(FDW)。

1. SQL/MED

在正式说明FDW之前,我们需要了解FDW的由来,想要了解FDW,那就不得不说SQL/MED。

  • SQL/MED ("SQL Management of External Data",SQL标准ISO/IEC 9075-9),是最早在2001年提出的用于集成管理外部数据的SQL标准ISO/IEC 9075-9:2001
  • 最新发布版本为ISO/IEC 9075-9:2016
  • 主要包含两部分主题

    • Foreign Table       a transparent access method for external data
    • DATALINK            a special SQL type intended to store URLs in database
  • Foreign Data Wrapper 是SQL/MED标准的一部分,定义访问外部数据源的接口,见下图:

2. FDW for PostgreSQL

2.1 演进

  • 2008年,PostgreSQL为适配SQL/MED标准,提出设计草案:,并于PostgreSQL 8.4版本开始逐步实现。
  • 2009年,PostgreSQL用户大会时,Peter Eisentraut的演讲说明当时PostgreSQL支持SQL/MED的现状与计划:

1570864400648_da44fb11_979e_416f_ac35_c54733f20825
1570955253672_b811996a_521c_475a_8519_2cf26558665b

  • 2011年,PostgreSQL 9.1支持只读方式访问外表(外表查询)
  • 2013年,PostgreSQL 9.3支持可写方式访问外表(外表插入/更新/删除)
  • ... ...

2.2 概况

  • 直至今日,PostgreSQL Global Development Group (PGDG)仅支持:file_fdw postgre_fdw
  • 更多的FDW可以在the PGXN website找到,但因不是官方支持的版本,需小心使用,更详细的说明见WIKI

image.png

2.3 核心

大体来说,PostgreSQL外表功能的核心实现可以简要概括如下:

2.4 不同

在实现外表功能的语法上,PostgreSQL与ISO/IEC 9075-9标准主要有如下不同:

  1. CREATE FOREIGN DATA WRAPPER
    CREATE_FOREIGN_DATA_WRAPPER
  • 语法上扩展了HANDLER和VALIDATOR从句
  • 标准里定义的LIBRARY和LANGUAGE从句并未实现
  1. CREATE FOREIGN TABLE
    CREATE_FOREIGN_TABLE
  • 绝大部分兼容 ISO/IEC 9075-9 (SQL/MED)标准
  • 允许字段空值约束
  • 允许无字段创建外表
  • 字段允许设定默认值也是PostgreSQL的一个功能扩展

3. FDW in ADBPG v6.0

3.1 概况

  • ADBPG v6中的FDW与社区PostgreSQL基本一致,可以像在PostgreSQL中一样在ADBPG v6中使用FDW功能。需要注意的是:postgres_fdw只能通过master而不能直接通过segment直接访问ADBPG。
  • 语法上,CREATE FOREIGN TABLECREATE SERVER 和 CREATE FOREIGN DATA WRAPPER 基本与社区PostgreSQL一致,只是额外增加mpp_execute属性,用于mpp query时,决定通过哪个主机获取外部数据,默认为‘master’。mpp_execute属性的优先级为:FOREIGN TABLE > FOREIGN SERVER > FOREIGN DATA WARPPER
    mpp_execute

3.2 示例

多说无益,以postgres_fdw为例演示FDW在ADBPG v6.0中的使用。

  • 编译postgres_fdw(当前默认不编译)。
  • 在保证网络可服务的前提下,在10.101.194.174上搭建集群A,在100.81.152.195上搭建集群B,配置如下:

集群A:10.101.194.174

postgres=# select * from gp_segment_configuration ;
 dbid | content | role | preferred_role | mode | status | port  |     hostname     |     address      |                           datadir
------+---------+------+----------------+------+--------+-------+------------------+------------------+--------------------------------------------------------------
    1 |      -1 | p    | p              | n    | u      | 19600 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/qddir/demoDataDir-1
    2 |       0 | p    | p              | s    | u      | 19650 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/dbfast1/demoDataDir0
    5 |       0 | m    | m              | s    | u      | 19653 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/dbfast_mirror1/demoDataDir0
    3 |       1 | p    | p              | s    | u      | 19651 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/dbfast2/demoDataDir1
    6 |       1 | m    | m              | s    | u      | 19654 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/dbfast_mirror2/demoDataDir1
    4 |       2 | p    | p              | s    | u      | 19652 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/dbfast3/demoDataDir2
    7 |       2 | m    | m              | s    | u      | 19655 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/dbfast_mirror3/demoDataDir2
    8 |      -1 | m    | m              | s    | u      | 19610 | rs1l13368.et2sqa | rs1l13368.et2sqa | /home/const/workspace_adbpg/demo/standby
(8 rows)

集群B:100.81.152.195

postgres=# select * from gp_segment_configuration ;
 dbid | content | role | preferred_role | mode | status | port  |     hostname      |      address      |                        datadir
------+---------+------+----------------+------+--------+-------+-------------------+-------------------+--------------------------------------------------------
    1 |      -1 | p    | p              | n    | u      | 15432 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/qddir/demoDataDir-1
    2 |       0 | p    | p              | s    | u      | 18000 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/dbfast1/demoDataDir0
    5 |       0 | m    | m              | s    | u      | 18003 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/dbfast_mirror1/demoDataDir0
    3 |       1 | p    | p              | s    | u      | 18001 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/dbfast2/demoDataDir1
    6 |       1 | m    | m              | s    | u      | 18004 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/dbfast_mirror2/demoDataDir1
    4 |       2 | p    | p              | s    | u      | 18002 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/dbfast3/demoDataDir2
    7 |       2 | m    | m              | s    | u      | 18005 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/dbfast_mirror3/demoDataDir2
    8 |      -1 | m    | m              | s    | u      | 16432 | e18b01547.et15sqa | e18b01547.et15sqa | /home/const/workspace/demo/standby
(8 rows)
  • 以集群B(100.81.152.195)作为外部数据源,配置pg_hba.conf文件后reload。
local       all     all                             trust
host        all     all         ::1/128             trust
host        all     all         127.0.0.1/32        trust
host        all     all         0.0.0.0/0           md5
  • 设置集群B const用户的登陆密码(1234)。
postgres=# \password const
Enter new password:
Enter it again:
  • 在集群B(100.81.152.195)的public schema下分别创建表x,y。
postgres=# create table x(id int, value float8, des text) distributed by (id);
CREATE TABLE
postgres=# create table y(id int, value float8, des text) distributed by (id);
CREATE TABLE
postgres=# insert into x select r, r*random(), md5((r*random())::text) from generate_series(1,1000000)r;
INSERT 0 1000000
postgres=# insert into y select r, r*random(), md5((r*random())::text) from generate_series(1,1000)r;
INSERT 0 1000
  • 准备在集群A(10.101.194.174)中创建外表 foreign_x 和 foreign_y分别对应集群B中的表x和y。
-- 创建postgres_fdw
CREATE EXTENSION postgres_fdw;

-- 创建foreign server
create server foreign_server_195
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS(host '100.81.152.195', port '15432', dbname 'postgres');

-- 创建user mapping
CREATE USER MAPPING FOR current_user
    SERVER foreign_server_195
    OPTIONS (user 'const', password '1234');

-- 创建foreign table foreign_x
CREATE FOREIGN TABLE foreign_x
(
    id int,
    value float8,
    des text
)
SERVER foreign_server_195
OPTIONS (schema_name 'public', table_name 'x');

-- 创建foreign table foreign_y
CREATE FOREIGN TABLE foreign_y
(
    id int,
    value float8,
    des text
)
SERVER foreign_server_195
OPTIONS (schema_name 'public', table_name 'y');

-- 查看foreign server
postgres=# \des+
                                                                     List of foreign servers
        Name        | Owner | Foreign-data wrapper | Access privileges | Type | Version |                       FDW Options                        | Description
--------------------+-------+----------------------+-------------------+------+---------+----------------------------------------------------------+-------------
 foreign_server_195 | const | postgres_fdw         |                   |      |         | (host '100.81.152.195', port '15432', dbname 'postgres') |
(1 row)

-- 查看foreign table
postgres=# \det+
                                     List of foreign tables
 Schema |   Table   |       Server       |              FDW Options               | Description
--------+-----------+--------------------+----------------------------------------+-------------
 public | foreign_x | foreign_server_195 | (schema_name 'public', table_name 'x') |
 public | foreign_y | foreign_server_195 | (schema_name 'public', table_name 'y') |
(2 rows)

-- 查询foreign_x
postgres=# select count(1) from foreign_x;
 count
--------
 1000000
(1 row)

-- 设置mpp_execute = all segments
postgres=# alter foreign table foreign_x options (add mpp_execute 'all segments');
ALTER FOREIGN TABLE
postgres=# \det+
                                     List of foreign tables
 Schema |   Table   |       Server       |              FDW Options               | Description
--------+-----------+--------------------+----------------------------------------+-------------
 public | foreign_x | foreign_server_195 | (schema_name 'public', table_name 'x', mpp_execute 'all segments') |
 public | foreign_y | foreign_server_195 | (schema_name 'public', table_name 'y') |
(2 rows)

-- 再次查询foreign_x (3 segments)
postgres=# select count(1) from foreign_x;
 count
--------
 3000000
(1 row)

4. 参考

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
4月前
|
缓存 编译器 测试技术
PHP 8新特性解析与应用
在软件开发的广阔天地中,PHP始终是一颗耀眼的星辰。随着PHP 8的发布,一系列激动人心的新特性为开发者带来了前所未有的编程体验。本文将深入探讨PHP 8中的JIT编译器、联合类型、命名参数、匹配表达式等关键特性,并通过实例分析它们如何优化代码结构、提升执行效率。我们将一起见证PHP 8如何开启现代化PHP开发的新篇章,并为读者提供实用的技术参考。
36 2
|
4天前
|
监控 数据挖掘 OLAP
深入解析:AnalyticDB中的高级查询优化与性能调优
【10月更文挑战第22天】 AnalyticDB(ADB)是阿里云推出的一款实时OLAP数据库服务,它能够处理大规模的数据分析任务,提供亚秒级的查询响应时间。对于已经熟悉AnalyticDB基本操作的用户来说,如何通过查询优化和性能调优来提高数据处理效率,是进一步提升系统性能的关键。本文将从个人的角度出发,结合实际经验,深入探讨AnalyticDB中的高级查询优化与性能调优技巧。
17 4
|
1天前
|
存储 SQL 缓存
AnalyticDB 实时数仓架构解析
AnalyticDB 是阿里云自研的 OLAP 数据库,广泛应用于行为分析、数据报表、金融风控等应用场景,可支持 100 trillion 行记录、10PB 量级的数据规模,亚秒级完成交互式分析查询。本文是对 《 AnalyticDB: Real-time OLAP Database System at Alibaba Cloud 》的学习总结。
|
4月前
|
安全 编译器 测试技术
PHP 8新特性解析与应用实践
本文深入探讨了PHP 8的新颖特性,并结合数据和案例分析,展示了这些新特性如何在实际开发中提升代码质量和执行效率。文章不仅涵盖了语言层面的更新,如JIT编译器和联合类型,还讨论了生态系统中的改进,例如改进的错误处理和性能优化技巧。通过逻辑严密的分析,本文旨在为读者提供一份关于PHP 8升级和应用的全面指南。
36 0
|
17天前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
22 1
|
3月前
|
分布式计算 安全 OLAP
7倍性能提升|阿里云AnalyticDB Spark向量化能力解析
AnalyticDB Spark如何通过向量化引擎提升性能?
|
4月前
|
存储 SQL 编译器
PHP 8新特性深度解析与实战应用
本文将深入探讨PHP 8的新增特性,并结合实际案例演示如何有效利用这些特性优化现有项目。通过本文,您将了解到PHP 8带来的性能提升、安全性增强以及代码简化等方面的改进,以及如何将这些新特性融入日常开发工作之中。 【7月更文挑战第29天】
49 8
|
4月前
|
缓存 安全 测试技术
深入PHP 7:新特性与性能提升解析
在PHP 7的发布中,我们见证了一系列令人兴奋的性能改进和新特性的加入。本文将深入探讨这些变化如何影响开发者的日常编程实践,并展示通过实际例子如何最大化利用PHP 7的优势。准备好迎接代码效率和开发体验的全新升级!
|
4月前
|
大数据 编译器 API
PHP 7新特性深度解析与应用实践
【7月更文挑战第28天】本文深入探讨PHP 7带来的革新特性,从性能优化到语法改进,逐一剖析其背后的技术原理和实际影响。通过实例展示如何有效利用这些新特性来提升开发效率和代码质量,为PHP开发者提供切实可行的升级和优化策略。
|
4月前
|
数据挖掘 编译器 PHP
PHP 8新特性解析及其对现代Web开发的影响
随着PHP 8的发布,这一广泛使用的服务器端脚本语言带来了一系列创新特性,旨在提升性能、增强语法的易用性以及支持最新的编程范式。本文将深入探讨PHP 8中的JIT编译器、联合类型、匹配表达式等关键特性,并通过实际案例分析它们如何优化代码结构、提高执行效率,并简化日常开发工作,从而全面评估PHP 8对现代Web开发实践的深远影响。

热门文章

最新文章