Thanks for the response peter.  It is my understanding that a
ReferenceProperty IS actually just a Key (http://code.google.com/
appengine/docs/python/datastore/
typesandpropertyclasses.html#ReferenceProperty).  If it isn't, how do
I get the key of itemB without dereferencing itemB?  There is no
KeyProperty.

I actually do need all the itemsB's though.  The next thing do is
memcache the list of itemB's and then call to_xml() on each item B to
send to the client.  The itemB's are more complex types, but not too
bad.  Maybe 20 fields of type int/string/bool.  The total itemB size
is not more than 512bytes.

I would be very interested if anyone could offer some clarification on
how the datastore scales with number of entities.  Half of the reason
I have this database scheme is that queries directly on itemB were
even slower or would fail with db.Timeout.  And that was doing only
"one read".


On Mar 10, 5:07 am, peterk <peter.ke...@gmail.com> wrote:
> Doh, I just thought of this as one potential simple way to improve
> your itemB dereferencing:
>
> http://code.google.com/appengine/docs/python/datastore/modelclass.htm...
>
> Create a list of the keys to your itemBs without dereferencing them,
> then pass the list to itemB.get(). I think this performs one single
> batch get..so it should be faster then 36 seperate reads.
>
> Try that out and let me know if it improves performance.. :)
>
> On Mar 10, 12:03 pm, peterk <peter.ke...@gmail.com> wrote:
>
> > As far as I know:
>
> > query = A.all().filter('intProperty', val).filter('date >=', date)
>
> > This is one read. Hence the relatively fast performance for getting
> > itemAs.
>
> > But this:
>
> > itemBs = [itemA.typeB for itemA in itemAs]
>
> > ..is n reads, where n is the number of itemAs you have. In your case,
> > an extra 36 reads.
>
> > That lines up with the figures you're providing..0.4s to get all
> > itemAs, then 2.2 for the (36) itemB reads.
>
> > There may be more optimal ways others can share for dereferencing your
> > itemBs to reduce the number of reads required, but in terms of
> > scalibility..if the number of itemAs returned will remain the same,
> > then your execution time for this computation should remain the same
> > regardless of the size of the database underneath. Datastore reads
> > are, I think, supposed to be fairly constant regardless of the number
> > of entities..so if you're always doing 36+1 reads then the cost should
> > always be roughly the same regardless of how many itemAs and itemBs
> > are in the datastore. I could be wrong on that..but that's my
> > expectation.
>
> > In terms of optimising your itemB dereferencing..do you need all those
> > itemBs at the point you're adding them to your list at the moment?
> > What is itemB made up of?
>
> > On Mar 10, 1:23 am, lenza <le...@lenza.org> wrote:
>
> > > App Engine.  Here is the situation:
>
> > > I have a database with about about 50k rows of type A, and maybe 500k
> > > rows of type B.
>
> > > Type A contains:
> > >   - ReferenceProperty (to type B)
> > >   - DateTimeProperty
> > >   - IntegerPropery
> > >   - 3 x StringProperty (at most 5 bytes each)
>
> > > I am performing the following query:
>
> > > def myQuery():
> > >    query = A.all().filter('intProperty', val).filter('date >=', date)
> > >    itemAs = [itemA for itemA in query]
> > >    itemBs = [itemA.typeB for itemA in itemAs]
> > >    return itemBs
>
> > > Even under no load, when retuning a modest number of elements, this
> > > function takes so long!  For example, I'm looking at a log entry where
> > > for 36 items the database took 0.4s to create the list of itemAs and
> > > 2.2s to create the list of itemB's.  Does this seem excessive?  What
> > > can I do to speed this up?  I was planing on these databases to grow
> > > 10x in size (although the queries will return the same number of
> > > items) so this is concerning.
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to