Max*_* L. 7 postgresql performance postgresql-performance
在单个事务的多个表中插入大量或行(数百万)所产生的额外成本是多少?
是否可以做一些事情(调整参数),以便在单个事务中大量插入的成本接近在自动提交中进行的成本?
我不确定您的限制是什么或您关心什么,但数百万行不是问题。数十亿行也不是真正的问题。事务越大,性能越好。交易有开销。
在我的旧 x230 上我
这是代码和结果。
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 亿行。
你把它倒过来了——在一个事务中执行多行通常比使用自动提交一次处理一行要好。原因是 a) 磁盘 I/O 和 b) 客户端和服务器之间的网络往返。您需要运行基准测试来找到适合您的数据和硬件的理想批量大小 - 尝试 100、1000、10000 大小的事务并查看。在某个时刻,当您遇到其他限制时,交易将达到峰值并超过“太大”。