国外服务器 9.2
本地服务器 9.5
表是 10GB
在与外国服务器相同的网络接口上执行数据传输
没有为数据设置索引
老办法:
- 复制到 - 2:36
- SCP-08:17
- 从 - 10:11 复制
postgres_fdw:
- 到老方法完成时,它已经完成了 800MB
insert into .. select * from foreign_table
- 到老方法完成时,它已经完成了 800MB
我是否错过了配置中的某些内容(意味着我可以改进它),或者postgres_fdw
只是不适合批量加载(意味着我无法改进它)?
(我将它用于小数据量的协调,它工作正常。insert select from fdw
代替运行 bash 命令的想法看起来很不错。)*
我尝试从本地服务器到远程服务器的 psql \copy table
- 六分钟 - 比通过 ssh 更快。
该fetch_size
选项在 9.6 之前不可用,可以模拟dblink_fetch(CURSOR, fetch_size)
- 请参阅下面的答案。
postgres_fdw 对于批量传输当然不如
copy to
,copy from
和scp
are 优化。毕竟,批量传输是这些工具存在的主要原因。但这并不意味着您无能为力。如果您在本地服务器上运行 9.6,您可以尝试增加 fetch_size。
在 9.6 之前,无法为服务器或外部表设置 fetch_size,但我们可以使用 dblinks 模拟此选项以进行批量操作。在下面的例子中,我通过模拟 fetch_size 从 100 到 100K 的变化,将postgres_fdw 中的 ~1GB 表批量选择从一小时半加速到两分钟。
感谢@jjanes,我
fetch_size
从 9.6 开始研究可用。唉,我不能去升级,所以我不得不实施一个解决方法。pg_stat_activity
我从本地服务器上注意到远程观看FETCH 100 FROM c1
,所以我认为 fetch_size = 100 在以前的版本中可能是硬编码的。所以我跑了一个小总结,用 dblink 获取 100 行的数据:所以花了 4235 秒...接下来我将总结中的 fetch_size 从 100 增加到 100*1000:
所以我看到
**FETCH 100000 FROM cr**
和预期的一样pg_stat_activity
,执行时间从 4235 秒变为 90 秒- 这是 40 倍!最后要提到的是
insert select from postgres_fdw
,dblink 使用 fetch 100 结束所花费的时间或多或少相同: