OK, keep going with the profiling, whats the total number of rows you are 
seeing with the joined load, 5000 total ?   sometimes a join is actually 
scrolling through many more rows than that, duplicate rows in the case of a 
cartesian product.    echo='debug' would show that.   Or there could be very 
large textual fields in rows that are being fetched repeatedly (in which case 
subqueryload() might be better).  There's a lot of reasons this could happen.




On Sep 12, 2014, at 3:16 AM, tatütata Okay <rogersher...@googlemail.com> wrote:

> Thats what I did before, activating echo=True shows me correct query too. 
> This joinedload takes 1.3 seconds for this 5000 entries. 
> And only 4 queries in general for complete side load. Adding one more 
> joinedload ends up in 2 seconds, thats way too much for 1700 customers and 5 
> k bought items
> 
> On Thu, Sep 11, 2014 at 10:12 PM, Simon King <si...@simonking.org.uk> wrote:
> The query that you are doing:
> 
>    customerorders = sqlsession.query(Customerorder)\
>     .join(Itemsbought.order)\
>     .all()
> 
> probably doesn't do what you intend. In particular, it doesn't populate the 
> Customerorder.itemsbought collection. So when you iterate over customerorders 
> and access the "itemsbought" property, it issues a new query for each order.
> 
> Try starting with something like this:
> 
>    customerorders = (sqlsession.query(Customerorder)
>                      .options(saorm.joinedload("itemsbought"))
>                      .all())
> 
> Hope that helps,
> 
> Simon
> 
> On 11 Sep 2014, at 20:54, Michael Bayer <mike...@zzzcomputing.com> wrote:
> 
> > then it sounds like you have lazy loading happening, check echo=True
> >
> >
> > On Sep 11, 2014, at 3:12 PM, tatütata Okay <rogersher...@googlemail.com> 
> > wrote:
> >
> >> Okay will try it. Maybe you got it wrong. I have only 5 k rows
> >>
> >> On Thu, Sep 11, 2014 at 8:55 PM, Michael Bayer <mike...@zzzcomputing.com> 
> >> wrote:
> >> three joins over 100K rows is going to be very slow, two seconds seems in 
> >> the ballpark.  EXPLAIN will show if there are any table scans taking place.
> >>
> >> as far as why the relationship is faster, it might be doing something 
> >> different, check the echo=True output.
> >>
> >> On Sep 11, 2014, at 2:35 PM, tatütata Okay <rogersher...@googlemail.com> 
> >> wrote:
> >>
> >>> Yeah that would have been my next steps. I hoped more for some hints if 
> >>> the setup is correct more if there are issues with the relationship 
> >>> configuration? I think speed related things come up when there are over 
> >>> 100000 entries and more? We speak here about 5000, thats why I think I 
> >>> did a mistake on the configuration of the relation patterns?
> >>>
> >>>
> >>> On Thu, Sep 11, 2014 at 8:12 PM, Michael Bayer <mike...@zzzcomputing.com> 
> >>> wrote:
> >>> for some tips on isolating where the speed issue is, follow the steps at: 
> >>> http://docs.sqlalchemy.org/en/latest/faq.html#how-can-i-profile-a-sqlalchemy-powered-application
> >>>
> >>> for too many joins, you also want to look into EXPLAIN PLAN.
> >>>
> >>>
> >>>
> >>> On Sep 11, 2014, at 12:57 PM, tatütata Okay <rogersher...@googlemail.com> 
> >>> wrote:
> >>>
> >>>> Hey,
> >>>> I got some shop tables like:
> >>>> customerorders, itemsbought, products whole query with three joins takes 
> >>>> nothing on command line sql. When I trying to achieve same thing with 
> >>>> ORM and my relationship it takes 1 second, joining all three 3 tables 2 
> >>>> seconds?
> >>>>
> >>>> May I come first up with my table and mapper definitions:
> >>>>
> >>>> class Products(Base):
> >>>>     __tablename__ = 'products'
> >>>>     id = Column(Integer, primary_key=True)
> >>>>     productname = Column(Unicode(255))
> >>>>     productname_en =Column(Unicode(255), default = u'nice product')
> >>>>     path = Column(Unicode(300))
> >>>>     pic = Column(Unicode(300), unique=True)
> >>>>     bigpic = Column(Unicode(300), unique=True)
> >>>>     sold = Column(Boolean)
> >>>>     price = Column(Integer)
> >>>>     locked = Column(Boolean)
> >>>>     sort = Column(Integer)
> >>>>     catid = Column(Integer)
> >>>>     sizeid = Column(Integer, ForeignKey('productsizes.sizeid'))
> >>>>     productsizes = relationship("ProductSizes", backref="products", 
> >>>> lazy='joined')
> >>>>     itemsbought = relationship("Itemsbought", backref="products")
> >>>>
> >>>>     def __init__(self, productname, path, pic, bigpic,  sold,  price, 
> >>>> sizeid, locked, sort, catid):
> >>>>         self.productname = productname
> >>>>         self.path = path
> >>>>         self.pic = pic
> >>>>         self.bigpic = bigpic
> >>>>         self.sold = sold
> >>>>         self.price = price
> >>>>         self.sizeid = sizeid
> >>>>         self.locked = locked
> >>>>         self.sort = sort
> >>>>         self.catid = catid
> >>>>
> >>>> class Customerorder(Base):
> >>>>     __tablename__ = 'customerorders'
> >>>>     id = Column(Integer, primary_key=True)
> >>>>     ip = Column(Unicode(40))
> >>>>     comment = Column(Unicode(1000))
> >>>>     plz = Column(Unicode(30))
> >>>>     name = Column(Unicode(100))
> >>>>     street = Column(Unicode(200))
> >>>>     ort = Column(Unicode(100))
> >>>>     date = Column(DateTime, default = func.now())
> >>>>     money_received = Column(Boolean)
> >>>>     shipped = Column(Boolean)
> >>>>
> >>>>     def __init__(self, comment, ip, street, plz, ort, name, 
> >>>> money_received):
> >>>>         self.ip = ip
> >>>>         self.customerid = customerid
> >>>>         self.comment = comment
> >>>>         self.street = street
> >>>>         self.plz = plz
> >>>>         self.ort = ort
> >>>>         self.name = name
> >>>>         self.money_received = money_received
> >>>>         self.shipped = shipped
> >>>>
> >>>> class Itemsbought(Base):
> >>>>     __tablename__ = 'itemsbought'
> >>>>     id = Column(Integer, primary_key=True)
> >>>>     orderid = Column(Integer, ForeignKey('customerorders.id'))
> >>>>     order = relationship('Customerorder', backref=backref("itemsbought"))
> >>>>     productid = Column(Integer, default = 0)
> >>>>
> >>>>     def __init__(self, productid, orderid):
> >>>>         self.productid = productid
> >>>>         self.orderid = orderid
> >>>>
> >>>>
> >>>> I try to query only Customerorder and Itemsbought without having those 
> >>>> relations to products:
> >>>>     customerorders = sqlsession.query(Customerorder)\
> >>>>     .join(Itemsbought.order)\
> >>>>     .all()
> >>>> or with joinedload, outerjoins all the same thing. log shows me always 
> >>>> sqlalchemy makes left outer joins.
> >>>> Trying to use this data in loop ends up in 1700 queries:
> >>>>
> >>>> for order in customerorders:
> >>>>   print order.name,
> >>>>     for item in order.itemsbought:
> >>>>       print item.productid
> >>>>
> >>>> I managed to get all this correct data with sizes and products in 2,5 s 
> >>>> with joinedload but this is a way too long for 5 k entries in 
> >>>> itemsbought and 1680 orders.
> >>>>
> >>>> Can someone point to what I am doin wrong? And whats the best way to get 
> >>>> all orders in an clearly arranged way with products, price, sizes etc.
> >>>>
> >>>> Cheers
> >>>>
> 
> --
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to