【问题标题】:FDW in Postgres: Batching ids for an external request?Postgres 中的 FDW:为外部请求批处理 id?
【发布时间】:2017-04-24 15:32:18
【问题描述】:

我正在使用 multicorn 开发一组外国数据包装器,但我遇到了批处理数据的问题。

所以,我有两个外部表,searchdata,每个表都由我正在编写的外部数据包装器支持。

我需要对这些表进行基本连接:

SELECT data.*
FROM search, data
WHERE search.data_id = data.id
AND search.term = 'search for this pls'

这行得通,但是data fdw 能够批量查询到服务器有一个障碍。如果search 表为给定的搜索返回5 个id,那么data fdw 对每个id 执行一次。支持data fdw 的 API 能够在一个请求中处理多个 id。

以下作品:

SELECT data.*
FROM data
WHERE id in ('2244', '31895')

在这种情况下,data fdw 接收到一个包含两个 id 的数组并且能够执行一个请求。

有什么方法可以让data fdw 有机会批量处理请求的 id 吗?

谢谢!

【问题讨论】:

  • 你的 PostgreSQL 版本是多少?
  • 9.6.2,使用 postgres 9.6 docker 容器
  • searchdata 是外部表,而不是 FDW 本身。我不确定我是否完全理解:您是在开发一些实际的 FDW(并希望编写它们以更好地执行)还是只是使用一些(并希望微调您的查询)?
  • 我正在使用 multicorn 编写 fdws。 fdws 正在向外部网络服务器发出请求以检索数据,我想以某种方式利用批处理这些请求。对于这个例子,每个 fdw 都有一个外表,datasearch

标签: postgresql foreign-data-wrapper multicorn


【解决方案1】:

您应该查看查询的 EXPLAIN 输出,然后您可能会看到 PostgreSQL 正在执行 嵌套循环连接,即它扫描 search 以查找匹配的行,并为每个结果行扫描 data 以查找匹配行。

PostgreSQL 有其他连接策略,例如 hash joins,但为此它必须读取 whole data 表,这可能不是一个胜利。 您可能想通过将enable_nestloop 设置为off 并测试查询性能来进行尝试。如果这是一种改进,您可能需要调整 data 上的外部表扫描的成本值,以反映高昂的“启动成本”,以便规划器更不愿意选择嵌套循环连接。

没有您建议的这种加入策略——虽然它很可能是 FDW 加入的胜利,但它在常规加入中没有优势。因此,如果您设想的连接策略确实是最佳策略,您必须首先从search 获取data_ids,为data 构造一个查询并在应用程序中实现连接。

【讨论】:

  • 谢谢!它肯定使用了嵌套循环,我已经调整了成本以使其避免“读取整个表格”的事情,不幸的是这不适用于这种情况。很高兴知道没有这样的加入策略(很容易看出为什么它对其他情况没有意义)。
猜你喜欢
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2018-08-10
  • 2023-02-09
  • 1970-01-01
  • 2014-07-06
  • 2020-07-20
相关资源
最近更新 更多