postgres_fdw:是否可以将数据推送到外部服务器进行连接?

7
假设我有一个查询,如下所示:
select * from remote_table
   join local_table using(common_key)

其中,remote_table是使用postgres_fdw创建的外部表,而local_table则是一个普通表。

local_table很小(100行),而remote_table很大(数百万行)。

看起来整个远程表都被拉取到本地进行连接,但将较小的表传输到远程服务器并在远程进行连接会更有效率。

有没有办法让postgres_fdw这样做呢?


1
一个CTE可能允许推迟执行吗?我没有测试过:WITH cte AS (SELECT common_key FROM local_table) SELECT * FROM remote_table WHERE common_key IN (TABLE cte); 仔细想想:我怀疑那样行不通... - Erwin Brandstetter
有一个关于另一个FDW的相关问题,我想出了一个不起作用的想法。虽然对于postgres_fdw(和Postgres 12?)可能有效。你可能想看一下:https://dev59.com/2broa4cB1Zd3GeqPoqhf#61493138 - Erwin Brandstetter
2个回答

0

使用连接是做不到这一点的,因为在不同服务器之间进行的表连接总是在本地执行。

您可以尝试类似以下的操作:

SELECT *
FROM (SELECT *
      FROM remote_table
      WHERE common_key IN (SELECT common_key FROM local_table)
     ) a
  JOIN local_table USING (common_key);

我没有测试过它,所以不确定它是否有效,但是想法是使用一个条件来进行外部表扫描,这个条件可以被下推并尽可能减少获取的数据量。


不,这会有与join相同的问题。只有在可以远程执行时,WHERE子句才会被下推。唯一的方法是将“local_table”的内容推送到远程数据库中才能使其起作用。 - wrschneider
想一想另一种解决方案,沿着我的答案思路,例如从“SELECT common_key FROM local_table”的结果构建一个IN列表。 - Laurenz Albe

0
你尝试过将本地数据部署到外部服务器的临时表中,然后将其连接到外部表中吗?不确定你的流程或者这是否对你来说是有效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接