【发布时间】:2020-04-27 14:03:53
【问题描述】:
我有一个对远程数据库中的特定表执行选择的 DBlink。 由于这个远程表非常大,我需要做一个过滤器(使用 where)来为本地数据库带来很少的行。 本地数据库和远程数据库之间的连接是通过具有每月数据流量限制的 4G 数据链路进行的。 我一直在经历巨大的数据消耗,但不明白为什么。
昨天我决定做一个测试。我在远程数据库中创建了一个仅包含必要数据的视图(已经应用了之前在 DBLink 中应用的位置)。 我通过 DbLink 重写了查询,此时指向远程视图并且没有任何位置。
结果是减少了数据消耗。
它给人的印象是Select via Dblink对远程表执行select *,把所有的数据都拿过来,然后应用到本地数据库的where,造成过度消耗。 当我在视图中分割数据时,不再发生这种情况。 有人对此案有任何解释吗?
以下是我执行的选择:
SELECT *
FROM dblink('cloud',
'select field1,
field2,
field3
from my_table
where field1 = 2
order by field1
limit 50'
)
AS rep( field1 int4,
field2 int4,
field3 int4
);
我做的另一个测试是对远程表中的数据进行备份,并删除大部分数据,只留下 DBlink 中使用的数据。 消耗也再次下降,证实了我的理论,即 Postgres 带来了所有数据并且只对本地数据库执行过滤。
【问题讨论】:
-
现在外部表比 DBlink 更受欢迎——
postgres_fdw可以降低这些条件。 -
您的示例无效。查询需要被引用。
-
对不起@jjanes,我写问题时的错。我刚刚更正了。
标签: postgresql view dblink