Postgres 中的 FDW:外部请求的批处理 ID?
FDW in Postgres: Batching ids for an external request?
我正在使用 multicorn 开发一组外部数据包装器,我 运行 遇到了批处理数据的问题。
所以,我有两个外国 table,search
和 data
,每个都由我正在编写的外国数据包装器支持。
我需要对这些 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
构造一个查询并在应用程序中实现连接.
我正在使用 multicorn 开发一组外部数据包装器,我 运行 遇到了批处理数据的问题。
所以,我有两个外国 table,search
和 data
,每个都由我正在编写的外国数据包装器支持。
我需要对这些 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
构造一个查询并在应用程序中实现连接.