使用 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 (...), (...), ...;
而不是使用 executemany
的 bulk_insert_mappings
,您会看到显着的性能改进。在这种情况下,您将希望至少在语句级别对行进行批处理以保持理智。
SQLAlchemy supports generating a multi-row VALUES
clause for a single INSERT
statement,因此您不必手工编写语句。
批次之间提交可能不会对性能产生太大影响,但这样做的原因是不要将打开的事务保留太长时间,这可能会影响其他事务 运行服务器。
您还可以尝试使用 COPY
将其加载到临时 table,然后 INSERT
从 table 加载它。
我有 50 万行要使用 SQLAlchemy 插入到 PostgreSQL 中。
为了提高速度,我使用 session.bulk_insert_mappings()
插入它们。
通常,我会将插入内容分成较小的批次以尽量减少 session
簿记。但是,bulk_insert_mappings()
使用 dicts
并绕过了很多传统的会话簿记。
如果我将插入分成更小的离散批次,比如每 10K 行插入一次,我是否仍会看到速度提升?
如果是这样,我应该在每 10K 行后关闭 PG 事务,还是让它一直打开?
根据我的经验,如果使用 INSERT INTO tbl (column1, column2) VALUES (...), (...), ...;
而不是使用 executemany
的 bulk_insert_mappings
,您会看到显着的性能改进。在这种情况下,您将希望至少在语句级别对行进行批处理以保持理智。
SQLAlchemy supports generating a multi-row VALUES
clause for a single INSERT
statement,因此您不必手工编写语句。
批次之间提交可能不会对性能产生太大影响,但这样做的原因是不要将打开的事务保留太长时间,这可能会影响其他事务 运行服务器。
您还可以尝试使用 COPY
将其加载到临时 table,然后 INSERT
从 table 加载它。