我想要使用SQLAlchemy插入到PostgreSQL中的500K行。
对于速度,我使用session.bulk_insert_mappings()
插入它们。
通常情况下,我会将插入分成较小的批次,以尽量减少session
簿记。但是,bulk_insert_mappings()
使用dicts
并绕过了许多传统的会话簿记。
如果我将插入分解成更小的离散批次,比如每隔10K行插入一次,我是否仍然会看到提高速度?
如果是这样,我应该在每10K行之后关闭PG交易,还是一直打开它?
答案 0 :(得分:4)
根据我的经验,如果您使用INSERT INTO tbl (column1, column2) VALUES (...), (...), ...;
而不是bulk_insert_mappings
使用executemany
,则会看到实质性的改进。在这种情况下,您希望至少在语句级别对行进行批处理以获得健全性。
SQLAlchemy supports generating a multi-row VALUES
clause for a single INSERT
statement,所以你不必亲自制作声明。
批处理之间的提交可能不会对性能产生太大影响,但这样做的原因是不能长时间保持打开的事务,这可能会影响服务器上运行的其他事务。 / p>
您还可以尝试使用COPY
将其加载到临时表中,然后INSERT
从该表中加载。