selectinload()
和 joinedload()
是如何工作的。而且我也知道在哪里选择哪个。基于文档:
一对多/多对多集合 - selectinload() 通常是最好的加载策略。它发出一个额外的 SELECT,该 SELECT 使用尽可能少的表,使原始语句不受影响,并且对于任何类型的原始查询都是最灵活的。它唯一的主要限制是在不支持“tuple IN”的后端使用具有复合主键的表时,该后端目前包括 SQL Server 和非常旧的 SQLite 版本;所有其他包含的后端都支持它。
多对一 - joinload() 策略是最通用的策略。在特殊情况下,如果潜在相关值的数量非常少,那么立即加载()策略也可能很有用,因为如果相关对象已经存在,则该策略将从本地会话中获取对象,而不会发出任何 SQL。
还有这里:
joinedload() 策略最适合加载相关的 多对一对象,因为这只需要额外的列 添加到在任何情况下都会获取的主要实体行。
是的,根据他们的行为,
joinedload
在“多对一”关系中比在“一对多”关系中表现更好。这是因为主行不会在前者中相乘。但另一个表的行仍然会相乘。在多对一关系中,结果集不会垂直增长,而是水平增长。
我想说的是,我认为即使在多对一关系中,
selectinload()
也会获取更少的数据。
我是否误解了这个概念?在多对一关系中,还有其他因素使“joinedload”成为比“selectinload”更好的选择吗?
我认为你需要进行测量。对于极端情况,可能更容易确定,即。每个“多”都有一个唯一的“一”还是所有“多”共享同一个“一”?
总体而言,这可能取决于数据库服务器、表的大小、结果的大小、列数等。
一般来说,虽然我认为
joinedload
对于平均数据集来说会更快,只是因为它是单个查询,并且结果的处理很简单,只需将它们按顺序加载到会话中,但是......你会必须测试一下。