如果我有成千上万的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
答案 0 :(得分:1)
是的,会有巨大的速度差异,因为COMMIT
很贵。它需要刷新到磁盘。除非你有快速回写缓存(电池支持的回写缓存RAID控制器,或一个好的SSD),否则这需要相当长的时间。 pg_test_fsync
会帮助您了解多长时间。
将工作批量处理为大型事务。如果您需要回滚单个插入内容,可以使用SAVEPOINT
- 虽然它们的性能成本有些高,但它们并不像完整交易那样昂贵,特别是如果您RELEASE SAVEPOINT
它们一次下一个是创建的。
交易规模的收益递减,因此除非您需要原子性,否则在单个tx中做数百万和数百万是毫无意义的。批量处理大小合适的块。最佳尺寸主要取决于存储设备上的磁盘刷新成本,但我的目标是开始使用几千行。
更好的是,使用COPY
,这会更快,尤其是涉及网络往返时。
有关详细信息,请参阅How to speed up insertion performance in PostgreSQL
答案 1 :(得分:0)
如果不需要回滚,在您的特定情况下,使用交易实际上会更快。
原因是交易按设计将以批次提交您的查询。使用事务在大多数情况下几乎没有开销(除非你的交易非常庞大)。