【问题标题】:Remote query execute with postgres_fdw, using an indexes使用索引使用 postgres_fdw 执行远程查询
【发布时间】:2016-10-10 11:31:44
【问题描述】:

如前所述,here postgres_fdw 无法访问索引。

一种解决方法是在远程服务器上创建一个视图,然后在本地服务器上为该视图创建外部表包装器。

但是如果我想将参数传递给我的视图怎么办?通常我会创建一个function(myparam) 那个RETURNS TABLE()。但是如何通过postgres_fdw 调用它?

有什么办法解决这种情况(如果不需要,最好不要使用dblink)?

示例

我有这样的查询要在我的远程数据库上执行:

select count(f.id_foo)
from foo f 
where f.date < _my_date

如您所见,里面有一个参数_my_date

所以我创建了外部表 my_remote_server_public.my_remote_server_public_foo 并从本地数据库运行它:

select count(f.id_foo)
from my_remote_server_public.my_remote_server_public_foo f 
where f.date < _my_date

但是当我这样做时 - 它会持续 2-3 分钟,因为 postgres_fdw 无法访问 foo 索引。

我想过在远程数据库上创建一个函数get_foo_by_date(_my_date date) 并通过本地数据库的postgres_fdw 调用它,但不知道这是否可能......

更新

假设我会将普通视图处理为内部具有恒定日期的外部表。

此视图将返回远程表中的 ID 列表。

我想从远程表中删除列出的行并将它们归档到本地表中。

当我这样称呼它时:

EXECUTE
'WITH rows_to_delete 
AS (DELETE from my_remote_server_public_foo 
    WHERE id_foo 
    IN 
    (SELECT * FROM my_remote_server_public_view_of_rows_to_delete) RETURNING *) 
INSERT INTO my_local_table 
SELECT * FROM rows_to_delete';

持续 5 分钟...再次因为 DELETE 查询无法访问索引...我是否也需要在这里使用 dblink 调用函数?还有其他解决方法吗?

【问题讨论】:

  • 你能举个例子说明你想做的事吗?
  • @LaurenzAlbe 问题已更新

标签: sql database postgresql foreign-data-wrapper postgres-fdw


【解决方案1】:

问题不在于postgres_fdw“无法访问索引”,而是聚合函数没有“下推”到远程服务器。

目前还没有很好的方法来做到这一点,尽管聚合下推显然在 PostgreSQL 想要添加的内容列表中。

最好的方法是使用dblink 来满足这样的要求。

在 PostgreSQL 9.6 中,postgres_fdw 中有一个新特性,你可以滥用它来下推函数。
您必须创建一个包含该函数的扩展并将其安装在本地和远程数据库上。然后您可以将此扩展添加到外部服务器上的extensions 属性中。如果函数是IMMUTABLE,你在本地调用它,它会被下推到远程服务器。
但这丑得无法形容,我不会推荐它。

作为“更新”提出的问题与问题无关,应该作为一个单独的问题提出。

这里的问题是 PostgreSQL 9.5 或更低版本

  • 外部表之间的连接不会下推到远程端

  • 更新和删除逐行操作,需要对每个删除的行进行一次往返

两者都在 PostgreSQL 9.6 中得到了改进(聚合不是这样)。

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多