【问题标题】:postgres_fdw: possible to push data to foreign server for join?postgres_fdw:可以将数据推送到外部服务器以供加入吗?
【发布时间】:2019-01-28 21:56:06
【问题描述】:

假设我有一个类似的查询

select * from remote_table
   join local_table using(common_key)

其中 remote_table 是 FOREIGN TABLEpostgres_fdwlocal_table 是常规表。

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

看起来远程表被完全拉出并在本地连接,而将较小的表发送到远程服务器并远程连接会更有效。

有没有办法让 postgres_fdw 做到这一点?

【问题讨论】:

  • CTE 可能允许下推?我没有测试:WITH cte AS (SELECT common_key FROM local_table) SELECT * FROM remote_table WHERE common_key IN (TABLE cte); 不过第二个:我怀疑它会飞……
  • 另一个 FDW 有一个相关问题,我想出了一个不起作用的想法。不过可能适用于 postgres_fdw (和 Postgres 12?)。你可能想看看:stackoverflow.com/a/61493138/939860

标签: postgresql postgresql-10 postgres-fdw


【解决方案1】:

你不能通过连接来做到这一点,因为不同服务器上的表之间的连接总是在本地执行。

你可以尝试的是:

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

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

【讨论】:

  • 不,这与加入有相同的问题。 WHERE 子句只有在可以远程执行时才会被下推。唯一可行的方法是将local_table 本身的内容推送到远程数据库。
  • 好吧,按照我的回答想一个不同的解决方案,例如从SELECT common_key FROM local_table 的结果构造一个IN 列表。
【解决方案2】:

您是否尝试过将本地数据部署到外部服务器上的临时表中,然后将其加入外部表中?不确定您的流程,或者这对您是否有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多