对于使用sqlalchemy ORM在postgreSQL中向表写入/更新大量行的任务,在提交前先在每一行提交或将所有行首先添加到会话中会更快/更有效吗?
例如 (1)
for foo in bar:
session.add(foo)
session.commit()
或: (2)
for foo in bar:
session.add(foo)
session.commit()
我通过对n = 20行的python脚本的运行时间进行计时进行了粗略的测试,结果以很小的优势支持(1),尽管我认为那可能只是噪音。
答案 0 :(得分:0)
好的,我做了更多的研究,结果发现SQLAlchemy在Google网上论坛上的邮件列表中可能有一个答案。积分归西蒙·金先生(Simon King)提供以下答案:
我认为处理大块行的想法是限制 Python进程的内存使用情况。在您调用session.flush()之前, 您所有的修改都保存在内存中。对于少量行 这不是问题,但对于大量用户来说可能是这样。
在实践中,此示例实际上可能没有什么不同, 因为默认的会话配置是每当您自动刷新 调用session.query()。
关于它是否比Table.update()更受青睐,这取决于 在您的用例上。 Table.update()通常会更快,因为所有 该工作将由数据库本身完成。如果你是改变 尝试使可以用SQL表示(即他们没有 复杂的依赖关系或需要外部信息),而您 如有必要,很高兴在以后重新同步您的会话,然后 Table.update()很好。
希望有帮助,
西蒙(Simon)