【问题标题】:Can reads occur whilst executing a bulk \copy batch of inserts执行批量 \copy 批量插入时是否会发生读取
【发布时间】:2020-06-21 23:37:57
【问题描述】:

我计划每分钟使用一次\copy 命令将大量行批量插入到 Postgres 表中。我的基准测试表明我应该能够每秒插入大约 40k 行,并且我计划每分钟插入 3 到 4 秒。

在发生\copy 转储时,表上的读取查询是否被阻塞或受到影响?我想知道插入也一样吗?

我还假设没有被\copy'd 进入的表不会遇到阻塞问题。

【问题讨论】:

    标签: postgresql concurrency bulk-load postgresql-copy


    【解决方案1】:

    The manual:

    使用并发控制的MVCC模型的主要优势 而不是锁定是在 MVCC 中为查询而获取的锁 (读取)数据与写入数据获取的锁不冲突, 所以阅读永远不会阻碍写作,写作永远不会阻碍阅读。

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

    所以,,读者不会被屏蔽。既不在目标表中,也不在任何其他表中。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多