PostgreSQL 中批量插入的最佳大小

use*_*223 6 postgresql insert

我有两个大整数的巨大表(500 000 000 行)。两列都单独索引。我正在使用语法批量插入此表:

INSERT into table (col1, col2) VALUES(x0, y0), (x1, y1),...;
Run Code Online (Sandbox Code Playgroud)

当插入少量项目(比方说 500 个)时,每一项的时间与插入大量项目(比方说 20000 个)时的时间相同。这是预期的行为吗?我认为 PostgreSQL 在一次插入更多值时会执行某种优化。请注意:自动提交已禁用。

感谢您的任何建议。

Lau*_*lbe 11

这并不奇怪。

如果您在单个事务中运行每个插入,则性能将受到瓶颈fsync每次提交时强制将数据输出到预写日志的瓶颈。

但是,一旦您的批次足够大,这将与实际的 I/O 相形见绌,并且无论您的批次有多大,性能都应该保持不变。无论插入 100 行还是 10000 行,每次插入都会执行相同的操作并花费相同的时间。

按照 PostgreSQL 的架构方式,唯一可能阻止您在单个事务中插入所有内容的因素是事务失败时会丢失大量工作。

  • 这是否适用于任何规模的时期?例如,插入 1M 行比将它们批处理为 10k 更有效(假设我不关心事务可能因网络问题或错误而失败) (2认同)