postgresql - 外部数据包装并发请求

标签 postgresql concurrency foreign-data-wrapper

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

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

最佳答案

以下答案主要针对 PostgreSQL 的外部数据包装器,postgres_fdw .

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

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

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

如果你运行 UPDATE s 或 DELETEWHERE无法下推到外部服务器的条件(检查执行计划),可能会发生您拥有比使用本地表时更多的锁。

想象一下这样的查询:

UPDATE remote_tab SET col = 0 WHERE <em><complicated condition that is true for only one row></em>;

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

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

SELECT ctid, col FROM remote_tab FOR UPDATE;

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

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

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

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

关于postgresql - 外部数据包装并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42805205/

相关文章:

postgresql - 如何解决 Postgres 11 错误 : cannot route inserted tuples to a foreign table

postgresql-9.4 - Postgres : foreign key to foreign table

python - 属性错误 : 'NoneType' object has no attribute '_instantiate_plugins' while creating engine

postgresql - 使用用户定义的事件将实时传感器数据记录到 RDBMS 中

javascript - 如何使用 `async` 实现屏障?

java - 当 writeLock 锁定时,ReentrantReadWriteLock 是否会读取?

c++ - 查找并发计数器的最小值

postgresql - 强制 postgres_fdw 使用密码?

postgresql - 从具有分隔符和不同数量元素的列中获取子字符串

django - 将数据自动索引到 elasticsearch