Postgres 中的 FDW:外部请求的批处理 ID?

FDW in Postgres: Batching ids for an external request?

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

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

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

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

这行得通,但是 data fdw 无法对服务器进行批量查询。如果给定搜索的 search table returns 5 个 ID,则对每个 ID 执行一次 data fdw。支持 data fdw 的 API 能够在一个请求中处理多个 ID。

以下作品:

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

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

data fdw 有机会为请求批处理 ID 的情况下,有什么方法可以使加入工作吗?

谢谢!

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

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

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