我在两个表之间有非常简单的父子(一对一)关系。
当我通过 ID
查找时,一切似乎都正常。但是如果我为 10k IDs
运行它,它需要将近 70 秒才能返回结果。
经过我的调试我发现我的字典的外键赋值花费了大部分时间。
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))
关于python - SQLAlchemy 外键访问优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095932/