外部数据包装并发请求

foreign data wrapper concurrent requests

postgreSQL 如何处理对外部 tables 的多个并发请求?

如果两个数据消费者要访问同一个外地table,是需要等待顺序查询,还是支持并发查询?

以下答案主要针对 Postgre 的国外数据包装器SQL、postgres_fdw

如果您需要有关其他外部数据包装器的信息,这将因外部数据包装器的实现和底层数据存储的功能而异。例如,要具有 file_fdw 的并发(读取)请求,您需要一个允许两个进程同时打开文件进行读取的文件系统。

针对同一个外国 table 的查询并发与本地 table 的查询一样。它是处理 SQL 语句、锁定修改的行直到事务完成以及类似操作的远程服务器。

因此可以有任意多个并发读者,读者不会阻塞作者,反之亦然。

如果你运行 UPDATEs or DELETEs with WHERE conditions than cannot be pushed down to the foreign server (check the execution plan), 它可以碰巧你有比使用本地 table.

时更多的锁

想象一下这样的查询:

UPDATE remote_tab SET col = 0 WHERE <em><只有一行为真的复杂条件></em>;

在本地 table 上,这只会锁定一行。

如果条件太复杂无法下推到国外服务器,postgres_fdw会先运行这样查询:

SELECT ctid, col FROM remote_tab FOR UPDATE;

这将检索并锁定 所有 行的 table。

然后 WHERE 条件将在本地应用,结果行在外部服务器上更新:

UPDATE remote_tab SET col = 0 WHERE ctid = ...;

所以在这种情况下,并发性和性能会受到很大影响。