远程查询使用postgres_fdw执行,使用索引

时间:2016-10-10 11:31:45

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

如上所述,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调用函数?还有其他解决方法吗?

1 个答案:

答案 0 :(得分:3)

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

目前还没有好方法可以做到这一点,尽管聚合推送显然是PostgreSQL想要添加的内容列表。

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

在PostgreSQL 9.6中,postgres_fdw中有一项新功能,您可以滥用该功能来推送功能。
您必须创建包含该功能的扩展,并将其安装在本地和远程数据库上。然后,您可以将此扩展添加到外部服务器上的extensions属性。如果函数是IMMUTABLE并且您在本地调用它,它将被下推到远程服务器 但这超出了描述的难度,我不推荐它。

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

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

  • 外来表之间的连接不会被推送到远程端

  • 更新和删除操作逐​​行操作,每个删除的行需要往返

PostgreSQL 9.6(不是聚合版本)都改进了。