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



我想使用 SQLAlchemy 将 500K 行插入到 PostgreSQL 中。

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

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

如果我将插入片段分解成更小的离散批次,比如每 10K 行进行一次插入,我是否仍然会看到速度改进?

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

根据我的经验,如果您使用 INSERT INTO tbl (column1, column2) VALUES (...), (...), ...; 而不是使用 bulk_insert_mappings,您将看到实质性的性能改进,后者使用 executemany 。在这种情况下,您需要至少在语句级别对行进行批处理以确保健全。

SQLAlchemy 支持为单个 INSERT 语句生成多行VALUES子句,因此您不必手动创建语句。

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

您还可以尝试使用 COPY 将其加载到临时表中,然后从该表中INSERT

最新更新