我有两个大整数的巨大表(5亿行)。两列都单独编制索引。我正在使用语法:
批量插入此表INSERT into table (col1, col2) VALUES(x0, y0), (x1, y1),...;
当插入少量物品(比方说500)时,每插入一件物品时的时间与插入大量物品时相同(比方说20000)。这是预期的行为吗?我认为PostgreSQL会在一次插入更多值时执行某种优化。请注意:自动提交被禁用。
感谢您的任何建议。
答案 0 :(得分:0)
这并不奇怪。
如果您在单个事务中运行每个插入,那么性能将受到fsync
的瓶颈,在每次提交时强制数据输出到Write Ahead Log。
但是,一旦您的批次足够大,实际的I / O就会相形见绌,无论您的批次有多大,性能都应该保持不变。无论您是插入100行还是10000行,每个插入都会执行相同的操作并占用相同的时间。
PostgreSQL架构的方式是,唯一可能阻止您在单个事务中插入所有内容的事情是在事务失败的情况下丢失的工作量。