使用 SQLAlchemy bulk_insert_mappings() 时批处理我的插入是否更快?

Is it faster to batch my inserts when using SQLAlchemy bulk_insert_mappings()?

我有 50 万行要使用 SQLAlchemy 插入到 PostgreSQL 中。

为了提高速度,我使用 session.bulk_insert_mappings() 插入它们。

通常,我会将插入内容分成较小的批次以尽量减少 session 簿记。但是,bulk_insert_mappings() 使用 dicts 并绕过了很多传统的会话簿记。

如果我将插入分成更小的离散批次,比如每 10K 行插入一次,我是否仍会看到速度提升?

如果是这样,我应该在每 10K 行后关闭 PG 事务,还是让它一直打开?

根据我的经验,如果使用 INSERT INTO tbl (column1, column2) VALUES (...), (...), ...; 而不是使用 executemanybulk_insert_mappings,您会看到显着的性能改进。在这种情况下,您将希望至少在语句级别对行进行批处理以保持理智。

SQLAlchemy supports generating a multi-row VALUES clause for a single INSERT statement,因此您不必手工编写语句。

批次之间提交可能不会对性能产生太大影响,但这样做的原因是不要将打开的事务保留太长时间,这可能会影响其他事务 运行服务器。

您还可以尝试使用 COPY 将其加载到临时 table,然后 INSERT 从 table 加载它。