当前位置: 首页 > news >正文

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

文章目录

  • 一、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_serverFOREIGN DATA WRAPPER postgres_fdwOPTIONS (host '****', port '5432', dbname 'foreign_db');

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

CREATE USER MAPPING FOR local_userSERVER foreign_serverOPTIONS (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_serverOPTIONS (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官方文档

相关文章:

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

文章目录 一、postgres_fdw 介绍二、安装使用示例三、成本估算四、 远程执行选项执行计划无法递推解决 参考文件: 一、postgres_fdw 介绍 postgres_fdw 模块提供外部数据包装器 postgres_fdw,可用于访问存储在外部 PostgreSQL 服务器中的数据。 此模块…...

什么是3D展厅?有何优势?怎么制作3D展厅?

一、什么是3D展厅? 3D展厅是一种利用三维技术构建的虚拟展示空间。它借助虚拟现实(VR)、增强现实(AR)等现代科技手段,将真实的展示空间数字化,呈现出逼真、立体、沉浸的展示效果。通过3D展厅&a…...

Linux下的CAN通讯

CAN总线 CAN总线简介 CAN&#xff08;Controller Area Network&#xff09;总线是一种多主从式 <font color red>异步半双工串行 </font> 通信总线&#xff0c;它最早由Bosch公司开发&#xff0c;用于汽车电子系统。CAN总线具有以下特点&#xff1a; 多主从式&a…...

【Python】pip安装加速:使用国内镜像源

【Python】pip安装加速&#xff1a;使用国内镜像源 零、使用命令行设置 设置全局镜像源 随便使用下面任一命令即可&#xff01; 阿里云&#xff1a; pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/豆瓣&#xff1a; pip config set global.in…...

SpringBoot lombok(注解@Getter @Setter)

SpringBoot lombok(注解Getter Setter) 使用lombok注解的方式&#xff0c;在编译生成的字节码文件中就会存在setter/getter等方法&#xff0c;减少代码量&#xff0c;方便了代码的维护 添加依赖 <dependency><groupId>org.projectlombok</groupId><artif…...

descrTable常用方法

descrTable 为 R 包 compareGroups 的重要函数&#xff0c;有关该函数以及 compareGroups 包的详细内容见&#xff1a;R包compareGroups详细用法 加载包和数据 library(compareGroups)# 加载 REGICOR 数据&#xff08;横断面&#xff0c;从不同年份纳入&#xff0c;每个变量有…...

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测 目录 回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.ReliefF-xgboost回归预测代码&#xff0c;对序列数据预测性能相对较高。首先通过ReleifF对输入特征计算权…...

年度最强悬疑美剧重磅回归,一集比一集上头

纽约的夜晚&#xff0c;平静被一声枪响打破&#xff0c;一场离奇的谋杀案悄然上演。《大楼里只有谋杀》正是围绕这样一桩扑朔迷离的案件展开的。三位主角&#xff0c;赛琳娜戈麦斯饰演的梅宝、史蒂夫马丁饰演的查尔斯、马丁肖特饰演的奥利弗&#xff0c;这些性格迥异的邻居因为…...

AI一点通: 简化大数据与深度学习工作流程, Apache Spark、PyTorch 和 Mosaic Streaming

在大数据和机器学习飞速发展的领域中&#xff0c;数据科学家和机器学习工程师经常面临的一个挑战是如何桥接像 Apache Spark 这样的强大数据处理引擎与 PyTorch 等深度学习框架。由于它们在架构上的固有差异&#xff0c;利用这两个系统的优势可能令人望而生畏。本博客介绍了 Mo…...

Python知识点:深入理解Python的模块与包管理

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 深入理解Python的模块与包管理 Python的模块和包是代码组织、复用和分发的基本…...

倒排索引(反向索引)

倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎和数据库管理系统中常用的一种数据结构&#xff0c;用于快速检索文档集合中的文档。在全文搜索场景中&#xff0c;倒排索引是一种非常高效的手段&#xff0c;因为它能够快速定位到包含特定关键词的所有文档。 1、基本…...

openCV的python频率域滤波

在OpenCV中实现频率域滤波通常涉及到傅里叶变换(Fourier Transform)和其逆变换(Inverse Fourier Transform)。傅里叶变换是一种将图像从空间域转换到频率域的数学工具,这使得我们可以更容易地在图像的频域内进行操作,如高通滤波、低通滤波等。 下面,我将提供一个使用Py…...

探索视频美颜SDK与直播美颜工具的开发实践方案

直播平台的不断发展&#xff0c;让开发出性能优异、效果自然的美颜技术&#xff0c;成为了技术团队必须面对的重要挑战。本篇文章&#xff0c;小编将深入讲解视频美颜SDK与直播美颜工具的开发实践方案。 一、视频美颜SDK的核心功能 视频美颜SDK是视频处理中的核心组件&#xf…...

Linux通过yum安装Docker

目录 一、安装环境 1.1. 旧的docker包卸载 1.2. 安装常规环境包 1.3. 设置存储库 二、安装Docker社区版 三、解决拉取镜像失败 3.1. 创建文件目录/etc/docker 3.2. 写入镜像配置 https://docs.docker.com/engine/install/centos/ 检测操作系统版本&#xff0c;我操作的…...

面部表情数据集合集——需要的点进来

文章目录 1、基本介绍2、每个数据集介绍2.1、FER2013&#xff08;已预处理&#xff09;2.2、FERPLUS&#xff08;已预处理&#xff09;2.3、RAF2.4、CK2.5、AffectNet2.6、MMAFEDB 3、获取方式 1、基本介绍 收集并整理了面部表情识别&#xff08;Facial Emotion Recognition&am…...

AI学习指南深度学习篇-Adagrad的Python实践

AI学习指南深度学习篇-Adagrad的Python实践 在深度学习领域&#xff0c;优化算法是模型训练过程中至关重要的一环。Adagrad作为一种自适应学习率优化算法&#xff0c;在处理稀疏梯度和非凸优化问题时表现优异。本篇博客将使用Python中的深度学习库TensorFlow演示如何使用Adagr…...

vue2使用npm引入依赖(例如axios),报错Module parse failed: Unexpected token解决方案

报错情况 Module parse failed: Unexpected token (5:2) You may need an appropriate loader to handle this file type. 原因 因为我们npm install时默认都是下载最新版本&#xff0c;然后个别依赖的版本太新&#xff0c;vue2他受不起这个福分。 解决方法 先去package.js…...

MySQl篇(基本介绍)(持续更新迭代)

目录 一、为什么要使用数据库 1. 以前存储数据的方式 2. 什么是数据库 3. 采用的数据库的好处 4. 如何理解数据库、数据库管理系统、SQL 5. 如何理解数据是有组织的存储 6. 现在的数据库 二、关系型数据系统 1. 什么是关系型数据库 2. 关系型数据库特点 3. 关系型数据…...

Java开发与实现教学管理系统动态网站

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…...

麒麟操作系统 MySQL 主从搭建

MySQL rpm64 架构搭建主从 文章目录 1.检查操作系统2.配置基础环境3.下载软件并安装4. 服务初始化5 主从搭建5.1 主节点配置(192.168.31.82)5.2 从节点配置(192.168.31.83)5.3 从节点配置(192.168.31.84)5.4 节点都重启5.5 在主机上建立帐户并授权slave5.6 salve 来同步master…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...