Postgres 在单个事务中在多个表中大量插入的成本

Max*_* L. 7 postgresql performance postgresql-performance

在单个事务的多个表中插入大量或行(数百万)所产生的额外成本是多少?

是否可以做一些事情(调整参数),以便在单个事务中大量插入的成本接近在自动提交中进行的成本?

Eva*_*oll 9

我不确定您的限制是什么或您关心什么,但数百万行不是问题。数十亿行也不是真正的问题。事务越大,性能越好。交易有开销。

在我的旧 x230 上我

  1. 创建一个包含一百万行的表。
  2. 添加一百万行。
  3. 添加十亿行。该死。这是很多的争论。

这是代码和结果。

test=# CREATE TABLE foo AS SELECT id::bigint FROM generate_series(1,1e6) AS gs(id);
SELECT 1000000
Time: 722.075 ms
test=# INSERT INTO foo SELECT id FROM generate_series(1,1e6) AS gs(id);
INSERT 0 1000000
Time: 1285.631 ms
test=# INSERT INTO foo SELECT id FROM generate_series(1,1e9) AS gs(id);
INSERT 0 1000000000
Time: 2142933.903 ms
Run Code Online (Sandbox Code Playgroud)

所以您可以看到,您可以在一秒钟内完成一百万行,或者在 35 分钟内完成十亿行。

如果您问为什么较大的批次速度较慢,我认为这就是 WAL 的开销,如果我以较小的批次执行它们,最终会显示出更大的开销(我认为)。

最大事务大小约为 2 到 40 亿,但为了不太大,我会将每个事务的行数限制为 20 亿行。


Gai*_*ius 4

你把它倒过来了——在一个事务中执行多行通常比使用自动提交一次处理一行要好。原因是 a) 磁盘 I/O 和 b) 客户端和服务器之间的网络往返。您需要运行基准测试来找到适合您的数据和硬件的理想批量大小 - 尝试 100、1000、10000 大小的事务并查看。在某个时刻,当您遇到其他限制时,交易将达到峰值并超过“太大”。

  • PG 将数据写入磁盘,而不是将它们保存在内存中。只有玩具数据库才会尝试将整个事务保存在内存中。 (3认同)
  • *“在某个时刻,当您遇到其他限制时,交易将“太大”,并且会达到峰值并超过。”*我对此不确定。我想不出有任何这样的限制可以表明这个说法在 PostgreSQL 中是正确的。 (2认同)