加快单独更新项目
Speed up updating items individually
我在 table 中有 12000 个项目,我想单独更新和提交每个项目。
items = db.session.query(User).all()
for item in items:
item.active = 0
# do stuff
db.session.commit()
我需要提交每次迭代,以便更改立即进入数据库。如果我 select 我第一个查询中的所有行提交很慢。如果我 select 较小的数据集(例如 400 行)它很快。
如果没有 select 较小的数据集,我应该怎么做才能获得更好的性能?
SQLAlchemy 在内部缓存所有查询的项目,但在发出 commit
时使该缓存过期。所以在下一次迭代中访问的实例处于 "expired" 状态并且 SQLAlchemy 重新查询数据库。所以你有效地做了:
- 开始时 大量 查询 12000 项
- 12000 次提交
- 11999 次对单个项目的查询
- 总共 24000 个查询
当您第一次只 select 400 次时,您看到的差异仅仅是规模效应:您只经历了三分之一的 select/commit 周期。
没有记录的方法来防止过期机制的发生。您可以忍受进行 24000 次查询,也可以在最后提交一次。
在一个大事务的循环之后,您很可能会更好。
我在 table 中有 12000 个项目,我想单独更新和提交每个项目。
items = db.session.query(User).all()
for item in items:
item.active = 0
# do stuff
db.session.commit()
我需要提交每次迭代,以便更改立即进入数据库。如果我 select 我第一个查询中的所有行提交很慢。如果我 select 较小的数据集(例如 400 行)它很快。
如果没有 select 较小的数据集,我应该怎么做才能获得更好的性能?
SQLAlchemy 在内部缓存所有查询的项目,但在发出 commit
时使该缓存过期。所以在下一次迭代中访问的实例处于 "expired" 状态并且 SQLAlchemy 重新查询数据库。所以你有效地做了:
- 开始时 大量 查询 12000 项
- 12000 次提交
- 11999 次对单个项目的查询
- 总共 24000 个查询
当您第一次只 select 400 次时,您看到的差异仅仅是规模效应:您只经历了三分之一的 select/commit 周期。
没有记录的方法来防止过期机制的发生。您可以忍受进行 24000 次查询,也可以在最后提交一次。
在一个大事务的循环之后,您很可能会更好。