可以在执行批量 \copy 批量插入时发生读取

Can reads occur whilst executing a bulk \copy batch of inserts

我计划使用 \copy 命令每分钟一次将大量行批量插入 Postgres table。我的基准测试显示我应该能够每秒插入大约 40k 行,我计划每分钟插入 3 或 4 秒。

\copy 转储发生时,对 table 的读取查询是否被阻止或受到影响?我也想知道插入物是否也一样?

我还假设未被 \copy 插入的 table 将不会遇到阻塞问题。

The manual:

The main advantage of using the MVCC model of concurrency control rather than locking is that in MVCC locks acquired for querying (reading) data do not conflict with locks acquired for writing data, and so reading never blocks writing and writing never blocks reading.

这就是 Postgres 使用的 MVCC 模型的美妙之处。

所以,没有,读者没有被屏蔽。既不在目标 table 中,也不在任何其他 table.

受影响?好吧,批量加载大量数据会给系统带来相当大的负载(尤其是 I/O),这可能会影响竞争相同资源的所有其他进程。因此,如果您的系统已经达到某些限制,读者可能会受到这种影响。

您的 COPY command 写入的行(通过 psql 的 \copy)在事务提交之前对其他事务不可见。

并发 INSERT 命令也不会被阻止 - 除非 你有 UNIQUE (或 PK) 约束/索引写入 竞争。避免具有重叠唯一值的竞争条件!即使使用 writing to indexes involves some short-term locking.

这样的非唯一索引,性能也会受到影响

通常,如果您计划每分钟进行大量写入,请将 table 上的索引保持在最低限度。每个索引都会产生额外的写入成本 - 如果写入模式不利,可能会比 table 膨胀更多。 Autovacuum 可能很难跟上。