SQLAlchemy 外键访问优化

SQLAlchemy foreign keys access optimazation

我在两个表之间有非常简单的父子(一对一)关系。

当我通过 ID 查找时,一切似乎都很好。但是如果我 运行 10k IDs 它需要将近 70 秒才能 return 结果。

经过我的调试,我发现我的字典的外键赋值花费了大部分时间。

result = {
    "name": parent.name,
    "child_name": parent.child.name
}

如果我注释掉 "child_name" 我会在大约 2 秒内(对于 10k)得到结果,而它需要大约 70 秒。

猜测是主查询只从数据库中加载Parent的实例,访问parent.child属性时,会生成单独的SQL语句对于每个 Parent 实例,以便从数据库中读取 Child 数据。结果,您最终得到 10K + 1 个查询。

一种改进方法是使用 Eager Loading。 对于 1-1 关系,一个不错的选择是 joinedload:

q = session.query(Parent).options(joinedload(Parent.child))