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))
我在两个表之间有非常简单的父子(一对一)关系。
当我通过 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))