Postgresql postgres_fdw扩展的低性能

Postgresql postgres_fdw扩展的低性能,postgresql,dblink,postgres-fdw,Postgresql,Dblink,Postgres Fdw,我需要定期将数据从TMP数据库复制到远程PROD数据库,并在列中进行一些数据修改。 当我使用PROD数据库中的postgres_fdw扩展(带有映射外部模式)时,复制一百万条记录的过程将持续6分钟 insert into prod.foreign_schema.foreign_table (select * from tmp.public.table limit 1000000); 但是,当我使用dblink从PROD数据库复制同一个表时(SQL在PROD数据库上运行,而不是在TEMP上运行

我需要定期将数据从TMP数据库复制到远程PROD数据库,并在列中进行一些数据修改。 当我使用PROD数据库中的postgres_fdw扩展(带有映射外部模式)时,复制一百万条记录的过程将持续6分钟

insert into prod.foreign_schema.foreign_table 
(select * from tmp.public.table limit 1000000);
但是,当我使用dblink从PROD数据库复制同一个表时(SQL在PROD数据库上运行,而不是在TEMP上运行),该过程持续20秒

insert into prod.public.table 
(select * from dblink('host=192.1... port=5432 dbname=... user=… password=…. connect_timeout=2', 'select * from tmp.production.table limit 1000000') as tab (id integer…..)
);
如何优化和缩短从临时数据库复制数据的过程

我必须在TMP数据库上运行SQL命令。
TMP和PROD数据库的版本是相同的(10)。

第一条语句将有效地运行许多小的插入,尽管有一条准备好的语句,因此您不会每次都有计划开销。因此,这两台服务器之间会有更多的往返,这可能是造成差异的原因。

第一条语句将有效地运行许多小的插入,尽管是使用一条准备好的语句,因此您不会每次都有计划开销。因此,这两台服务器之间会有更多的往返,这可能是造成差异的原因。

不相关,但是:整个SELECT语句周围的括号完全没有用处,因为其中一个将运行。postgres_fdw允许您在本地显示映射的位置映射外部表,但不允许您直接使用外部数据库的名称引用它们。注意:
LIMIT
without
ORDER
毫无意义。这只是一个示例,重要的是性能之间的差异。无关,但是:整个SELECT语句周围的括号是完全无用的,因为其中一个语句将运行。postgres_fdw允许您在本地显示映射的地方映射外部表,但它不允许您直接使用外部数据库的名称引用它们。注意:
LIMIT
而不使用
ORDER
是没有意义的。这只是一个示例,重要的是性能之间的差异。事实上,即使您将其写成
\copy foreign\u schema.table from…
,它也会将其转换为单独的插入。你知道是否有人在努力改进这个吗?不,我不知道。@jjanes我还没有听说有任何这方面的活动。就个人而言,我认为FDW接口不是批量DML的最佳接口。但如果我没记错的话,postgres\u fdw优化了其他一些批量DML操作。事实上,即使您将其编写为
\copy foreign\u schema.table from…
它也会将其转换为单个插入。你知道是否有人在努力改进这个吗?不,我不知道。@jjanes我还没有听说有任何这方面的活动。就个人而言,我认为FDW接口不是批量DML的最佳接口。但如果我没记错的话,postgres_fdw优化了其他一些批量DML操作。