外部数据包装并发请求
foreign data wrapper concurrent requests
postgreSQL 如何处理对外部 tables 的多个并发请求?
如果两个数据消费者要访问同一个外地table,是需要等待顺序查询,还是支持并发查询?
以下答案主要针对 Postgre 的国外数据包装器SQL、postgres_fdw
。
如果您需要有关其他外部数据包装器的信息,这将因外部数据包装器的实现和底层数据存储的功能而异。例如,要具有 file_fdw
的并发(读取)请求,您需要一个允许两个进程同时打开文件进行读取的文件系统。
针对同一个外国 table 的查询并发与本地 table 的查询一样。它是处理 SQL 语句、锁定修改的行直到事务完成以及类似操作的远程服务器。
因此可以有任意多个并发读者,读者不会阻塞作者,反之亦然。
如果你运行 UPDATE
s or DELETE
s 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 = ...;
所以在这种情况下,并发性和性能会受到很大影响。
postgreSQL 如何处理对外部 tables 的多个并发请求?
如果两个数据消费者要访问同一个外地table,是需要等待顺序查询,还是支持并发查询?
以下答案主要针对 Postgre 的国外数据包装器SQL、postgres_fdw
。
如果您需要有关其他外部数据包装器的信息,这将因外部数据包装器的实现和底层数据存储的功能而异。例如,要具有 file_fdw
的并发(读取)请求,您需要一个允许两个进程同时打开文件进行读取的文件系统。
针对同一个外国 table 的查询并发与本地 table 的查询一样。它是处理 SQL 语句、锁定修改的行直到事务完成以及类似操作的远程服务器。
因此可以有任意多个并发读者,读者不会阻塞作者,反之亦然。
如果你运行 UPDATE
s or DELETE
s 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 = ...;
所以在这种情况下,并发性和性能会受到很大影响。