【问题标题】:Postgres - DBLINK - How it works?Postgres - DBLINK - 它是如何工作的?
【发布时间】: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


【解决方案1】:

dblink 只是将查询写入另一端。它当然不会去掉 WHERE 或 LIMIT。我不知道实际发生了什么,但你这里提出的理论无法解释它。

要验证我的断言,您可以在外部设置 log_statement = 'all' 并观察实际运行的查询。

【讨论】:

  • 最有趣的是,在 Postgres 文档中,给出的示例总是在原始选择之外有 Where 子句。里面没有子句。请参阅下面的文档示例: SELECT * FROM dblink('dbname=postgres options=-csearch_path=', 'select proname, prosrc from pg_proc') AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea% '; ``无论如何,我都会听从你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多