【问题标题】:SQLAlchemy - reduce commits countSQLAlchemy - 减少提交计数
【发布时间】:2015-11-02 03:44:45
【问题描述】:

我将 SQLAlchemy 0.9.8 和 PostgreSQL 9.3 用于一个负载非常重的项目。但是我仍然相信它的开销在项目生命的这个阶段是可以接受的。据我了解,它使用 unit of work 模式,在第一次查询数据库之前使用隐式begin,在 HTTP 请求处理结束时使用显式commit(或rollback) .数据库日志分析工具(pgbadger)显示,最常见的数据库查询是commit。此查询也是最慢的查询之一。现在,我想减少 SQLAlchemy 的默认工作流发出的无用 commits 的数量。还有其他一些众所周知的使用这个 ORM 的模式吗?

【问题讨论】:

  • 您是在自动提交还是在许多地方调用 Session.commit。 SqlAlchemy 中的正常工作流程是为工作单元(即 Web 请求或任务作业或类似的东西)创建会话,使用该会话完成所有工作,然后在完成后调用 Session.commit 最后,或回滚失败。如果您为每个查询获得一个新会话,您将获得这种类型的行为。没有一些代码示例或更多细节,这是我能做的最好的。
  • 我使用标准工作流程(工作单元)。请求结束时只有一次提交。但是很多请求只使用 SELECT 查询,或者不需要原子性。所以,我有很多无用的提交。
  • 有了你提供的细节(不是那么多),我想到了几件事:你称之为“无用的提交”需要很少的时间 => 实际上你应该尝试寻找您花费更多时间而不是最频繁的查询。无论如何,你得到的最频繁的查询是提交是很奇怪的,即使它是一个“无用的提交”,它也应该在它前面加上一个select。实际上select 应该是最频繁的查询。也许这是一个不好的线索(就像@MichaelRobellard建议的autocommit)。希望对您有所帮助。
  • @lrnzcig,实际上,commit 是最慢查询中最频繁的查询。当然,select 是一般的领导者。
  • 好的。但图片仍然不太合适。如果许多提交是“无用的提交”,那么它们几乎不需要任何时间。我真的不知道这个 pgbadger,这是你在使用的吗?无论如何你应该能够判断是否有慢速和快速提交。

标签: python postgresql transactions sqlalchemy unit-of-work


【解决方案1】:

您可以在提交之前检查会话中是否有任何内容:

session.new  # new
session.dirty  # updated
session.deleted  # deleted

【讨论】:

  • 看起来很有趣。特别是如果有很多请求只有SELECT 查询。我要收集一些统计数据。
猜你喜欢
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2011-07-20
相关资源
最近更新 更多