将INSERT分组为交易的速度差异?

时间:2014-12-09 21:56:46

标签: postgresql

如果我有成千上万的INSERT INTO语句,如果我在一次交易中有这些语句,速度是否有任何显着差异。

换句话说,备选方案A和B之间是否有明显的速度差异。

备选方案A:

BEGIN
INSERT INTO STATEMENT 1
INSERT INTO STATEMENT 2
...
INSERT INTO STATEMENT 1000
COMMIT;

备选方案B:

INSERT INTO STATEMENT 1
INSERT INTO STATEMENT 2
...
INSERT INTO STATEMENT 1000

2 个答案:

答案 0 :(得分:1)

是的,会有巨大的速度差异,因为COMMIT很贵。它需要刷新到磁盘。除非你有快速回写缓存(电池支持的回写缓存RAID控制器,或一个好的SSD),否则这需要相当长的时间。 pg_test_fsync会帮助您了解多长时间。

将工作批量处理为大型事务。如果您需要回滚单个插入内容,可以使用SAVEPOINT - 虽然它们的性能成本有些高,但它们并不像完整交易那样昂贵,特别是如果您RELEASE SAVEPOINT它们一次下一个是创建的。

交易规模的收益递减,因此除非您需要原子性,否则在单个tx中做数百万和数百万是毫无意义的。批量处理大小合适的块。最佳尺寸主要取决于存储设备上的磁盘刷新成本,但我的目标是开始使用几千行。

更好的是,使用COPY,这会更快,尤其是涉及网络往返时。

有关详细信息,请参阅How to speed up insertion performance in PostgreSQL

答案 1 :(得分:0)

如果不需要回滚,在您的特定情况下,使用交易实际上会更快

原因是交易按设计将以批次提交您的查询。使用事务在大多数情况下几乎没有开销(除非你的交易非常庞大)。