Python SQLAlchemy迭代性能差

Python SQLAlchemy迭代性能差,python,python-2.7,sqlalchemy,Python,Python 2.7,Sqlalchemy,下面的代码块查询约2000行的表。循环需要20秒才能执行!从我有限的知识来看,我不认为我在做2000个查询,只是一个,但也许我不了解“.”运算符及其在幕后的作用。如何修复此循环以更快地运行?有没有办法调整顶级查询的s.t.第二个for循环总共不进行3000次查询(如果事实上是这样的话) 下面是我制作的一个代码测试块,用来验证实际上是这个内部循环导致了大量的时间消耗 block = [] cnt = 0 for blah in dbsession.query(mytable): tic =

下面的代码块查询约2000行的表。循环需要20秒才能执行!从我有限的知识来看,我不认为我在做2000个查询,只是一个,但也许我不了解“.”运算符及其在幕后的作用。如何修复此循环以更快地运行?有没有办法调整顶级查询的s.t.第二个for循环总共不进行3000次查询(如果事实上是这样的话)

下面是我制作的一个代码测试块,用来验证实际上是这个内部循环导致了大量的时间消耗

block = []
cnt = 0
for blah in dbsession.query(mytable):
    tic = time.time()
    for a in blah.component:
        cnt += 1
    block.append(time.time()-tic)
print "block: %s seconds    cnt: %s" % (sum(block), cnt)

# block: 20.78191 seconds    cnt: 3021
使用所选最佳答案的建议,for循环变成:

for blah in dbsession.query(mytable).options( joinedload(mytable.componentA)).options(mytable.componentB)).options(mytable.componentC)

这导致每个组件的内环分别从20-25秒变为0.25、0.59和0.11秒。查询本身现在需要大约18秒。。。因此,我的总节省时间约为55秒。

每次访问
.component
时,都会发出另一个SQL查询

您可以在上阅读更多内容,但要一次加载所有内容,您可以将查询更改为以下内容:

from sqlalchemy.orm import joinedload

dbsession.query(mytable).options(joinedload('component'))

每次访问
.component
时,都会发出另一个SQL查询

您可以在上阅读更多内容,但要一次加载所有内容,您可以将查询更改为以下内容:

from sqlalchemy.orm import joinedload

dbsession.query(mytable).options(joinedload('component'))

什么是
blah.component
?专栏?关系?“我不认为我在做2000个查询”:您应该启用日志记录或将
echo=True
传递给引擎。我不熟悉DBs,但我相信这是一种关系。它列在orm.mapper(a,b,properties={'component':orm.relationship(othercomponent,secondary=,primaryjoin==,secondaryjoin==})什么是
blah.component
?一列?一个关系?“我不认为我在做2000个查询”:您应该启用日志记录或将
echo=True
传递给引擎。我不熟悉DBs,但我相信存在关系。它列在orm.mapper中(a,b,properties={'component':orm.relationship(othercomponent,secondary=,primaryjoin==,secondaryjoin=})for循环是否会变成:for blah,dbsession.query中的blahcomponent…?不,只需
for dbsession.query中的blah(…
),SQLAlchemy知道当您访问
.component
时,它已经被加载了。文字甚至无法表达我的感激之情…21s到0.37如果我有多个关系要加载,我会选择吗(joinedload(mytable.componentx).joinedload(mytable.componentx).joinedload(mytable.componentx).不,您需要
选项(joinedload(mytable.componentx),joinedload(mytable.Component))
。方法链接用于嵌套关系。for循环是否会变成:dbsession.query中的for blah,blahcomponent…?不,只是dbsession.query中的
(…
,SQLAlchemy知道当您访问
.component
时,它已经被加载了。文字甚至无法表达我的感激之情…21s到0.37如果我有多个关系要加载,我会做选项(joinedload(mytable.componentx)。joinedload(mytable.componentx))?不,你会做
选项(joinedload(mytable.componentx),joinedload(mytable.componenty))
。方法链接用于嵌套关系。