加速单独更新项目

时间:2015-03-15 20:13:01

标签: python mysql sqlalchemy flask-sqlalchemy

我在表中有12000个项目,我想单独更新和提交每个项目。

items = db.session.query(User).all()

for item in items:
    item.active = 0
    # do stuff
    db.session.commit()

我需要提交每次迭代,以便更改立即转到数据库。如果我在第一个查询中选择所有行,则提交速度很慢。如果我选择较小的数据集(例如400行),则速度很快。

如果不选择较小的数据集,我应该怎样做才能获得更好的性能?

1 个答案:

答案 0 :(得分:1)

SQLAlchemy在内部缓存所有查询的项目,但在发出commit时使该缓存过期。因此,在下一次迭代中访问的实例位于"过期" state和SQLAlchemy重新查询数据库。所以你有效地做了:

  1. 一个大量的查询,最初为12000个项目
  2. 12000提交
  3. 11999查询个别项目
  4. 总共24000次查询
  5. 当您第一次选择400时,您所看到的差异仅仅是规模的影响:您只需要经过三分之一的选择/提交周期。

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

    在一次大型交易中,只需在循环之后提交就可能会更好。