我有两个使用SQLAlchemy ORM的子查询版本:
subq1 = session.query(su.DistCode,dr.RtrId, su.RtrCode, su.InvoiceNo, su.SlabId, sh.SchId, sslab.PurQty, sslab.DiscPer, sslab.FlatAmt).\
join(sh).\
join(dr, and_(dr.DistCode==su.DistCode, dr.RtrCode==su.RtrCode)).\
join(sslab,and_(su.SlabId==sslab.SlabId, sh.SchId==sslab.SchId)).\
subquery()
另一个是:
subq1 = session.query(su.DistCode,dr.RtrId, su.RtrCode, su.InvoiceNo, su.SlabId, sh.SchId).\
join(sh).\
join(dr, and_(dr.DistCode==su.DistCode, dr.RtrCode==su.RtrCode)).\
subquery()
两者之间的唯一区别是包含了一个连接:
.join(sslab,and_(su.SlabId==sslab.SlabId, sh.SchId==sslab.SchId))
我使用两个版本的代码,一个接一个。你知道吗
subq2 = session.query(ds.DistCode, ds.RtrId, ds.PrdCde, ds.SalInvDte, ds.SalInvNo,
(ds.SalInvQty*ds.SelRateBeforTax).label('SBT'), ds.SalInvSch,
pdet.ProductId, dr.RtrChannelCode, dr.GeoName, dr.RtrClassCode, dr.RtrCode,
dr.RtrGroupCode).join(pdet).outerjoin(dr, and_(ds.DistCode==dr.DistCode, ds.RtrId==dr.RtrId)).subquery()
rset = session.query(subq2.c.DistCode, subq2.c.RtrId, subq2.c.RtrCode, subq2.c.SalInvNo,
subq2.c.SalInvDte, subq2.c.PrdCde, subq2.c.ProductId, subq2.c.SBT, subq2.c.SalInvSch,
subq2.c.RtrChannelCode, subq2.c.RtrClassCode, subq2.c.RtrGroupCode,
subq2.c.GeoName, subq1.c.SlabId, subq1.c.SchId).join(subq1,and_(subq1.c.DistCode==subq2.c.DistCode, subq1.c.RtrId==subq2.c.RtrId, subq1.c.InvoiceNo==subq2.c.SalInvNo)).join(spid,and_(subq2.c.ProductId==spid.ProductID, subq1.c.SchId==spid.SchemeID))
df = pd.read_sql(rset.statement, rset.session.bind)
结果让我目瞪口呆。第一个查询进入一个无限循环(或者需要10小时+;而另一个则需要全部26秒!你知道吗
为了调试这个问题,我将两个版本的“subq1”作为独立查询运行,两个版本都运行得非常好—运行时间不到3秒。你知道吗
有什么办法能把这个问题搞清楚吗?你知道吗
在当今量子计算和自动驾驶汽车的世界里,我认为多重连接是一个简单的问题。原来是的。你知道吗
我的同事提出了这个答案,它奏效了。我错过了小组赛。按子查询分组明显减少了处理时间。你知道吗
我所要做的就是把subq1改成:
注意最后的队伍。很有魅力。运行时间不到一分钟。
相关问题 更多 >
编程相关推荐