【问题标题】:How to improve SQLAlchemy performance?如何提高 SQLAlchemy 的性能?
【发布时间】:2012-04-03 18:53:08
【问题描述】:

我制作了一个客户端应用程序,该应用程序使用 HTTP 与 Python 2 服务器进行通信,并使用一个简单的 API。服务器广泛使用 SQLAlchemy 的 ORM 来为这些 HTTP 请求提供数据。问题是我的 CPU 使用率很高,即使只有很少的活动客户端。该服务器应该能够同时为数百个客户端提供服务,每个客户端每秒大约 1 个请求,因此它应该仍然是可管理的(或者我希望如此)。

如何提高性能?我知道问题出在 ORM 上,因为 cProfile 非常清楚地显示了这一点。一个查询显然执行了大约 10000 条 Python 指令,这看起来很奇怪。我尝试插入不同的数据库引擎/后端并将解释器更改为 Pypy 只是为了好玩,但它显然没有解决原始问题,也没有提高性能。

我在这里做错了什么?我真的希望这是一个“嗯,呃!”问题。

我的人际关系应该属于不同的类型吗?渴望,懒惰,动态等?目前,我没有具体说明任何内容。

非常感谢您的帮助。

【问题讨论】:

标签: python sql sqlalchemy


【解决方案1】:

这是一个非常广泛的问题,但在使用 ORM 时肯定需要遵守一些原则。 ORM 很昂贵并且可能是资源密集型的;想想当数据被引入模型时,所有在幕后发生的事情来组装和维护对象关系! ORM 如何知道何时获取数据?当您触摸对象的头部时,它应该急切地加载并建立所有关系,还是应该只在初始查询的关键紧密循环中急切地加载您始终需要的东西?这就是 zzzeek 的答案所在;去查看查询日志,看看 ORM 做了什么。然后你会说,哦,废话!为什么当我只需要这件事时它会做这一切,你会去研究急切与延迟加载,更新你的模型,瞧!你会加快你的 ORM 100 倍。您也可以采取另一种方式,告诉它​​延迟加载所有内容,但是您最终可能会观察到一堆非常具体的查询而不是单个批量查询,因此其他事情会变慢。总的想法是开辟一条道路,这样您就不会在需要之前获取批量数据,而是尽您所能进行批量查询,以避免无数的单个查询。
https://dev.to/tinazhouhui/introduction-to-object-relational-mapping-the-what-why-when-and-how-of-orm-nb2

【讨论】:

  • 感谢您的回答,尽管我必须承认,10 年后,这个答案对我来说不再那么重要了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2021-10-13
  • 2018-03-01
  • 2020-04-28
  • 2014-09-22
  • 2010-11-04
相关资源
最近更新 更多