1

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

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

4

1 回答 1

3

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

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

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

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

如果您运行UPDATEs 或DELETEs 的WHERE条件不能下推到外部服务器(检查执行计划),则可能会发生比使用本地表时拥有更多锁的情况。

想象一下这样的查询:

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

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

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

SELECT ctid, col FROM remote_tab FOR UPDATE;

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

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

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

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

于 2017-03-15T11:10:35.987 回答