为什么在 SQLAlchemy 中的多对一关系中,joinedload() 是比 selectinload() 更好的选择

问题描述 投票:0回答:1

我知道

selectinload()
joinedload()
是如何工作的。而且我也知道在哪里选择哪个。基于文档

一对多/多对多集合 - selectinload() 通常是最好的加载策略。它发出一个额外的 SELECT,该 SELECT 使用尽可能少的表,使原始语句不受影响,并且对于任何类型的原始查询都是最灵活的。它唯一的主要限制是在不支持“tuple IN”的后端使用具有复合主键的表时,该后端目前包括 SQL Server 和非常旧的 SQLite 版本;所有其他包含的后端都支持它。

多对一 - joinload() 策略是最通用的策略。在特殊情况下,如果潜在相关值的数量非常少,那么立即加载()策略也可能很有用,因为如果相关对象已经存在,则该策略将从本地会话中获取对象,而不会发出任何 SQL。

还有这里

joinedload() 策略最适合加载相关的 多对一对象,因为这只需要额外的列 添加到在任何情况下都会获取的主要实体行。

是的,根据他们的行为,

joinedload
在“多对一”关系中比在“一对多”关系中表现更好。这是因为主行不会在前者中相乘。但另一个表的行仍然会相乘。在多对一关系中,结果集不会垂直增长,而是水平增长。

我想说的是,我认为即使在多对一关系中,

selectinload()
也会获取更少的数据。

我是否误解了这个概念?在多对一关系中,还有其他因素使“joinedload”成为比“selectinload”更好的选择吗?

python database sqlalchemy orm
1个回答
0
投票

我认为你需要进行测量。对于极端情况,可能更容易确定,即。每个“多”都有一个唯一的“一”还是所有“多”共享同一个“一”?

总体而言,这可能取决于数据库服务器、表的大小、结果的大小、列数等。

一般来说,虽然我认为

joinedload
对于平均数据集来说会更快,只是因为它是单个查询,并且结果的处理很简单,只需将它们按顺序加载到会话中,但是......你会必须测试一下。

© www.soinside.com 2019 - 2024. All rights reserved.