外部数据包装器并发请求

时间:2017-03-15 09:02:59

标签: postgresql concurrency foreign-data-wrapper

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

如果两个数据使用者想要访问同一个外表,是否必须等待并按顺序执行查询,或支持查询的并发性?

1 个答案:

答案 0 :(得分:2)

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

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

针对同一外表的查询并发与本地表一样。它是处理SQL语句的远程服务器,在事务完成之前锁定已修改的行,类似。

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

如果运行的UPDATEDELETE条件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 = ...;

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