1

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

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

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

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

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

以下作品:

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

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

有什么方法可以让datafdw 有机会为请求批处理 id 的加入工作?

谢谢!

4

1 回答 1

0

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

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

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

于 2017-04-25T09:11:16.780 回答