如何提高SQLAlchemy的性能?

sve*_*aro 6 python sql sqlalchemy

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

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

我在这做错了什么?我真的希望这是一个"好吧,呃!" 问题.

我的关系应该是不同的类型吗?渴望,懒惰,动态等?现在,我没有特别说明.

非常感谢.

小智 3

这是一个非常广泛的问题,但是在使用 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