postgres_fdw访问存储在外部 PostgreSQL 服务器中的数据

news2024/9/20 17:54:57

文章目录

  • 一、postgres_fdw 介绍
  • 二、安装使用示例
  • 三、成本估算
  • 四、 远程执行选项
    • 执行计划无法递推解决
  • 参考文件:

一、postgres_fdw 介绍

postgres_fdw 模块提供外部数据包装器 postgres_fdw,可用于访问存储在外部 PostgreSQL 服务器中的数据。

此模块提供的功能与旧 dblink 模块的功能有很大重叠。但 postgres_fdw 为访问远程表提供了更透明且符合标准的语法,并且在许多情况下可以提供更好的性能。

使用 postgres_fdw 准备远程访问:

  • 使用 CREATE EXTENSION 安装 postgres_fdw 扩展。

  • 使用 CREATE SERVER 创建一个外部服务器对象,以表示要连接到的每个远程数据库。指定连接信息,除了 user 和 password,作为服务器对象的选项。

  • 使用 CREATE USER MAPPING 为要允许访问每个外部服务器的每个数据库用户创建用户映射。指定要作为用户映射的 user 和 password 选项使用的远程用户名和密码。

  • 为每个您想要访问的远程表使用 CREATE FOREIGN TABLE 或 IMPORT FOREIGN SCHEMA 创建一个外部表。外部表的列必须与引用的远程表相匹配。但是,如果您将正确的远程名称指定为外部表对象的选项,则可以使用与远程表不同的表和/或列名。

现在,您只需从外部表中 SELECT 即可访问存储在其底层远程表中的数据。您还可以使用 INSERT、UPDATE、DELETE、COPY 或 TRUNCATE 修改远程表。(当然,您在用户映射中指定的远程用户必须具有执行这些操作的权限。)

请注意,在访问或修改远程表时,SELECT、UPDATE、DELETE 或 TRUNCATE 中指定的 ONLY 选项无效。

请注意,postgres_fdw 目前不支持带有 ON CONFLICT DO UPDATE 子句的 INSERT 语句。但是,如果省略了唯一索引推断规范,则支持 ON CONFLICT DO NOTHING 子句。另请注意,postgres_fdw 支持由对分区表执行的 UPDATE 语句调用的行移动,但目前它不处理在同一命令中其他位置将更新要将移动的行插入其中的远程分区也是 UPDATE 目标分区的情况。

通常建议将外部表的列声明为与远程表引用的列完全相同的数据类型(如果适用,还包括排序规则)。虽然 postgres_fdw 目前在需要时相当宽容地执行数据类型转换,但由于远程服务器对查询条件的解释与本地服务器不同,因此当类型或排序规则不匹配时可能会出现令人惊讶的语义异常。

请注意,可以声明外部表的列比其底层远程表少,或者列顺序不同。与远程表的列匹配是按名称进行的,而不是按位置进行的。

二、安装使用示例

以下是如何使用 postgres_fdw 创建外键表的示例。首先安装扩展:

CREATE EXTENSION postgres_fdw;

在这里插入图片描述
因为没有远端环境,接下来我将使用本地的其他数据库作为外部数据库。
在这里插入图片描述后使用 CREATE SERVER 创建一个外部服务器。在此示例中,我们希望连接到侦听端口 5432 的主机 192.83.123.89 上的 PostgreSQL 服务器。在远程服务器上,连接到的数据库名为 foreign_db:

CREATE SERVER foreign_server
        FOREIGN DATA WRAPPER postgres_fdw
        OPTIONS (host '****', port '5432', dbname 'foreign_db');

foreign_server是服务名,host是远端ip,port是远端端口,dbname是远端数据库名
在这里插入图片描述
还需要使用 CREATE USER MAPPING 定义用户映射,以识别将在远程服务器上使用的角色:

CREATE USER MAPPING FOR local_user
        SERVER foreign_server
        OPTIONS (user 'foreign_user', password 'password');

local_user是你本地的数据库用户名,foreign_server是上一步定的服务名,foreign_user是远端用户名,password是远端密码
在这里插入图片描述
现在可以使用 CREATE FOREIGN TABLE 创建外键表。在此示例中,我们希望访问远程服务器上名为 some_schema.some_table 的表。它的本地名称将是 foreign_table:

CREATE FOREIGN TABLE fdw_test1 (
        id int
)
        SERVER foreign_server
        OPTIONS (schema_name 'public', table_name 'fdw_test1');

在这里插入图片描述
在这里插入图片描述
测试成功,能够成功的在postgres数据库中查到test数据库中的数据。

三、成本估算

postgres_fdw 通过对远程服务器执行查询来检索远程数据,因此理想情况下,扫描外部表的估计成本应该是远程服务器上完成此操作所需的成本,加上一些通信开销。获取此类估算的最可靠方法是询问远程服务器,然后添加一些开销 — 但对于简单的查询,可能不值得为获取成本估算而付出额外的远程查询成本。因此 postgres_fdw 提供以下选项来控制如何执行成本估算

use_remote_estimate (boolean)
此选项可以为外部表或外部服务器指定,它控制 postgres_fdw 是否发出远程 EXPLAIN 命令来获取成本估算。外部表的设置将覆盖其服务器的任何设置,但仅针对该表。默认值为 false。

fdw_startup_cost (floating point)
此选项可以为外部服务器指定,它是一个浮点值,将被添加到该服务器上任何外部表扫描的估计启动成本中。这表示建立连接、解析和规划远程端的查询等的额外开销。默认值为 100。

fdw_tuple_cost (floating point)
此选项可以为外部服务器指定,它是一个浮点值,用作该服务器上外部表扫描的每个元组的额外成本。这表示服务器之间的数据传输的额外开销。您可以增加或减少此数字,以反映到远程服务器的网络延迟较高或较低。默认值为 0.01。

当 use_remote_estimate 为 true 时,postgres_fdw 从远程服务器获取行计数和成本估算,然后将 fdw_startup_cost 和 fdw_tuple_cost 添加到成本估算中。当 use_remote_estimate 为 false 时,postgres_fdw 执行本地行计数和成本估算,然后将 fdw_startup_cost 和 fdw_tuple_cost 添加到成本估算中。除非远程表的统计信息的本地副本可用,否则此本地估算不太可能非常准确。在外部表上运行 ANALYZE 是更新本地统计信息的方法;这将扫描远程表,然后计算并存储统计信息,就像该表是本地表一样。保留本地统计信息可以是减少远程表每次查询规划开销的有用方法 — 但如果远程表经常更新,则本地统计信息很快就会过时。

以下选项控制此类 ANALYZE 操作的行为

analyze_sampling (text)
此选项可以为外部表或外部服务器指定,它确定外部表上的 ANALYZE 是在远程端对数据进行抽样,还是读取并传输所有数据并在本地执行抽样。支持的值为 off、random、system、bernoulli 和 auto。 off 禁用远程抽样,因此所有数据都将在本地传输和抽样。 random 使用 random() 函数执行远程抽样以选择返回的行,而 system 和 bernoulli 依赖于这些名称内置的 TABLESAMPLE 方法。 random 适用于所有远程服务器版本,而 TABLESAMPLE 仅自 9.5 起支持。 auto(默认值)自动选择推荐的抽样方法;目前,它表示 bernoulli 或 random,具体取决于远程服务器版本。

四、 远程执行选项

默认情况下,只有使用内置运算符和函数的 WHERE 子句才会考虑在远程服务器上执行。涉及非内置函数的子句在获取行后会在本地检查。如果此类函数在远程服务器上可用,并且可以依赖它们生成与本地相同的结果,则可以通过发送此类 WHERE 子句以进行远程执行来提高性能。可以使用以下选项控制此行为

extensions (string)
此选项是已安装的 PostgreSQL 扩展名的逗号分隔列表,这些扩展名在本地和远程服务器上以兼容版本安装。属于已列出扩展名的不可变函数和运算符将被视为可运送到远程服务器。此选项只能为外部服务器指定,不能为每个表指定。

使用 extensions 选项时,用户有责任 确保已列出的扩展名在本地和远程服务器上存在且行为相同。否则,远程查询可能会失败或行为异常。

fetch_size (integer)
此选项指定 postgres_fdw 在每次获取操作中应获取的行数。它可以为外部表或外部服务器指定。表上指定的选项将覆盖为服务器指定的选项。默认值为 100。

batch_size (integer)
此选项指定 postgres_fdw 在每次插入操作中应插入的行数。它可以为外部表或外部服务器指定。表上指定的选项将覆盖为服务器指定的选项。默认值为 1。

请注意,postgres_fdw 一次插入的实际行数取决于列数和提供的 batch_size 值。该批处理作为单个查询执行,而 libpq 协议(postgres_fdw 用于连接到远程服务器)将单个查询中的参数数量限制为 65535。当列数 * batch_size 超过限制时,将调整 batch_size 以避免错误。

此选项在复制到外部表时也适用。在这种情况下,postgres_fdw 一次复制的实际行数的确定方式与插入情况类似,但由于 COPY 命令的实现限制,它最多限制为 1000。

执行计划无法递推解决

了解了以上内容,我们可以知道当查询设计到不稳定函数或者特定插件的函数时,执行计划将无法递推,所以我们需要解决这个问题就需要在连接中哦配置特定的插件。
在这里插入图片描述
比如以上这种情况:

alter server youerserver options(extensions 'postgis');

我们需要添加外部插件到服务中,就能解决问题。

参考文件:

pg官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言代码练习(第二十三天)

今日练习: 65、有 n 个整数,使前面各数顺序向后移动 m 个位置,最后 m 个数变成最前面 m 个数,写一函数实现以上功能,在主函数中输入 n 个整数和输出调整后的 n 个数。(要求用指针) 66、 n 个人围…

JavaScript 基础 - 第17天_AJAX综合案例

文章目录 Day02_AJAX综合案例目录学习目标01.案例_图书管理-介绍目标讲解小结 02.Bootstrap 弹框_属性控制目标讲解小结 03.Bootstrap 弹框_JS控制目标讲解小结 04.案例_图书管理\_渲染列表目标讲解小结 05.案例_图书管理\_新增图书目标讲解小结 06.案例_图书管理\_删除图书目标…

网络编程Udp协议

文章目录 UDP协议1、什么是UDP协议?一、定义与基本概念二、主要特点三、报文格式四、应用场景五、总结 2、如何使用Java中的UDP套接字?一、UDP常用APIDatagramSocketDatagramPacket 二、UDP协议下的客户端-服务器服务器客户端 UDP协议 UDP协议&#xff…

电脑怎么录制视频?游戏直播、教学分享必备!

在数字化时代,电脑录屏已成为游戏直播、教学分享、会议记录等多种场景下的必备技能,但有些朋友可能不知道怎么高效又清晰的录制视频,下面就给大家汇总了几个简单方法,一起来学习下吧~ 1. 嗨格式录屏大师 录屏大师软件免费下载_高…

方位大模型教程:从基础入门到实战应用

2024年大西洋彼岸的OpenAi公司,首次向世界吹响「大模型主导未来世界变革」的号角。 AI大模型,正在构建的颠覆力,为了更好的入局AI大模型,这次我特意复盘和整理大模型学习脉络,开了30节大模型的课程,包含大…

推荐一个java屏幕共享项目

java 屏幕共享项目 https://github.com/SpringStudent/JavaDesktopShare

【JAVA入门】Day44 - 字节打印流和字符打印流

【JAVA入门】Day44 - 字节打印流和字符打印流 文章目录 【JAVA入门】Day44 - 字节打印流和字符打印流一、字节打印流二、字符打印流三、输出语句和打印流的关系 打印流也是一种高级包装流,但是它只有输出,没有输入。 打印流一般是指:…

Qt_控件的QWidget属性介绍

目录 1、QWidget的核心属性 2、enabled 3、geometry 3.1 代码测试geometry 4、windowTitle 4.1 代码测试windowTitle 5、windowIcon 5.1 QIcon设置图标 5.2 qrc机制 5.3 代码测试windowIcon 6、windowOpacity 6.1 代码测试windowOpacity 7、cursor 7.1 代码测试…

使用xjar+exe4j+inno setup把加密后的jar打包成exe应用程序并创建服务

1、使用xjar对jar包进行加密 在项目的pom.xml中加入xjar的插件依赖&#xff0c;最好用2.x.x版本&#xff0c;高版本不支持-Dxjar.mode&#xff0c;无法免密码启动 github地址&#xff1a;xjar-maven-plugin <plugin><groupId>com.github.core-lib</groupId>…

RDD2022 道路瑕疵检测数据集

RDD2022 道路瑕疵数据集 txt标签或者xml标签 一共23767张图片 D00 D01 D20 D40四类 D00纵向裂缝 D10横向裂缝 D20网状裂缝 D40坑洞。 RDD2022 道路瑕疵检测数据集介绍 数据集概述 RDD2022&#xff08;Road Defect Detection 2022&#xff09;是一个专门用于道路瑕疵检测的数…

【MATLAB GUI 设计第一篇 】

文章目录 前言一、MATLAB GUI 是什么&#xff1f;二、guide 的使用1.进入GUI界面2. 布置绘图3.修改字体4. 回调函数&#xff0c;完成功能5. 整个函数和回调函数6.修改回调函数7. 显示效果8. 补充 三、 APP 的使用1.进入APP界面2.在 APP 菜单下 新建空白APP3.创建回调函数4.显示…

OpenCV class2-C#+winfrom显示控件使用窗口大小并内存管理

一.控件效果说明 二.代码声明&#xff08;已经循环读取10000次&#xff09; 全局 OpenCvSharp.Point point new OpenCvSharp.Point(0, 0); OpenCvSharp.Size size2; Mat src new Mat(); 初始化 size2 new OpenCvSharp.Size(pictureBox1.Size.Width, pictureBox1.Size.Hei…

京东技术专家的修炼之道|“六边形战士”周默分享

前言 最近&#xff0c;京东零售智能增长研发总监周默在京东内部分享了他在京东工作近10年的经验与成长。周默自2015年加入京东以来&#xff0c;经历了后端架构、大数据、基础算法和业务算法等多个技术领域&#xff0c;获得了集团金项奖、最美京东人、集团算法大牛等多项荣誉&a…

C语言错题本

本学渣在一个人学习的途中遇到过许多问题 如果没有老师的帮助可能很长时间都走不出来 所以我也希望我的错误能帮助到你 9月13日 题一 未赋值的局部指针是野指针(C) 题二 PS:对于指针来说&#xff0c;传递的是指针值的副本&#xff0c;point 函数内部对 p 的任何修改都不会影响…

ClickHouse的安装配置+DBeaver远程连接

1、clickhouse的下载&#xff1a; 先去clickhouse官网进行下载&#xff0c;继续往下翻找文档&#xff0c;将DBeaver也下载下来 下载地址&#xff1a;https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…

3DGS:3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文解读

目录 一、导言 二、相关工作 1、传统场景重建 2、神经渲染与辐射场 3、点云渲染 三、3DGS 1、SFM初始化稀疏点云 2、3D高斯椭球 3、协方差 4、球谐函数 5、3D高斯椭球集建立 6、3D投影2D 7、3D渲染公式 四、损失函数 五、基于梯度自适应改变点云的分布方式 六…

第四天旅游线路预览——从贾登峪到喀纳斯景区入口(贾登峪游客服务中心)

第四天&#xff1a;从贾登峪到喀纳斯风景区入口&#xff0c;晚上住宿贾登峪&#xff1b; 从贾登峪到喀纳斯景区入口&#xff08;贾登峪游客服务中心&#xff09;&#xff1a; 1&#xff09;早上8&#xff1a;00起床&#xff0c;吃完早饭&#xff0c;8&#xff1a;30出发&#…

Leetcode 旋转图像

解题思路&#xff1a; 转置矩阵&#xff1a;通过将矩阵的行列互换来实现转置操作。水平翻转矩阵&#xff1a;通过将每行的数据进行对称交换&#xff0c;从而完成90度旋转。 通过这两个步骤&#xff0c;矩阵就会顺时针旋转90度。 class Solution { public:void rotate(vector…

Unity报错:error CS8805: Program using top-level statements must be an executable.

大多数人都不想犯错&#xff0c;但压力大时总是动作变形 大概意思网上查了一下&#xff0c;就是说 C# 的第一&#xff08;top)行有错误&#xff0c;或者类&#xff08;类的头部&#xff09;就没写全 这什么意思呢&#xff1f;又定位不到具体是哪个类 但肯定是刚修改了一点点代…