我想使用 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
。