【发布时间】: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