【问题标题】:Joining Tables between Multiple Foreign Servers with Foreign Data Wrapper Causes Performance Issue使用外部数据包装器连接多个外部服务器之间的表会导致性能问题
【发布时间】:2020-07-15 19:54:55
【问题描述】:

我的一个遗留 PHP 应用程序正在使用带有 Foreign Data Wrapper 的 PostgreSQL 数据库。该数据库有一个本地表和两个外部服务器(一个指向数据库 A,另一个指向数据库 B)。

应用程序使用 ORM 来构造 SQL 查询。其中一个复杂的查询实际上是跨两个外部服务器连接 6 个表以及本地表。而且查询会永远挂起,因为这 6 个表平均有数百万条记录。

在旧版应用中还有更多类似的查询。我已将国​​外服务器配置为use_remote_estimate 'true',并增加了fetch_size,但仍然没有明显的改进。

我想知道是否可以在国外服务器上进行一些配置以优化查询速度。在我开始重写整个应用程序以不使用 PHP 和 ORM 之前。

【问题讨论】:

  • 您不能将所有数据库移动到一个数据库中并使用模式将它们分开吗?

标签: postgresql foreign-data-wrapper


【解决方案1】:

FDW 中的选择性估计问题非常普遍,并且可能导致计划的性能极差。既然您正在寻找灵丹妙药,您是否尝试过在本地服务器的外部表上运行 ANALYZE,以便它可以使用本地统计数据来制定一些计划?您可能需要设置一个克隆来测试它。ANALYZE 也会使事情变得更糟,一旦完成就没有简单的方法可以撤消它。

另一个步骤可能是在外部服务器上将 cursor_tuple_fraction 设置为 1(或至少远高于默认值)。如果整体查询计划在本地方面是合理的,这可能会有所帮助,但在国外方面的执行情况却很糟糕。

除此之外,您需要查看典型错误查询的 EXPLAIN (VERBOSE) 和 EXPLAIN (ANALYZE) 以弄清楚发生了什么。

在我开始重写整个应用程序以不使用 PHP 和 ORM 之前。

为什么会有帮助?您是否已经知道如何重写查询以使其更快,您只是无法让 ORM 配合?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2014-02-28
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多