加快单独更新项目

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 重新查询数据库。所以你有效地做了:

  1. 开始时 大量 查询 12000 项
  2. 12000 次提交
  3. 11999 次对单个项目的查询
  4. 总共 24000 个查询

当您第一次只 select 400 次时,您看到的差异仅仅是规模效应:您只经历了三分之一的 select/commit 周期。

没有记录的方法来防止过期机制的发生。您可以忍受进行 24000 次查询,也可以在最后提交一次。

在一个大事务的循环之后,您很可能会更好。