多行插入与事务性单行插入

Ali*_*lov 5 postgresql

在 Postgres (>10) 上使用多行插入是否有任何性能提升:

insert into tbl (c1, c2) values
(v1, v2)
(v3, v4);
Run Code Online (Sandbox Code Playgroud)

超过:

begin;
insert into tbl (c1, c2) values (v1, v2);
insert into tbl (c1, c2) values (v3, v4);
commit;
Run Code Online (Sandbox Code Playgroud)

我无耻地复制了以下问题的代码片段,但这个问题是不同的,因为它是关于事务多行插入与多单行插入

jja*_*nes 6

是的,它可以产生巨大的差异。

例如,我做了一个包含一百万个值列表的单语句插入,耗时 7 秒。我在一个事务中完成了 100 万次单行插入,耗时 110 秒。这是15倍的差异。

这是针对表没有约束或索引的情况。通过将两种方法减慢几秒钟,使用单个索引将差距缩小到仅快 10 倍。一旦索引足够大以至于无法缓存在 RAM 中,那么这两种方法都会变得很慢,以至于它们之间的差异可能变得相对微不足道。

请注意,您链接的相关问题的公认答案不正确。无论是多值插入还是一堆单值插入,索引维护都是以相同的方式完成的——至少对于 BTree 索引是这样。有关于优化索引维护的讨论,但如果实施优化,它们可能会以适用于两种类型的 INSERT 的方式完成。