[sqlalchemy] sqlalchemy speed help

2011-05-02 Thread Adrian
I'm facing some interesting speed issues with my database that only
seem to crop up within sqlalchemy. I have 2 tables in a one-to-one
relationship, with about ~1 million rows each. From Python, I grab an
object from one table (table A):
rowA = session.query(A).limit(1).one()

And then access a row in table B:
blah = rowA.b.someRow

I noticed that for ~500 of these, it started taking a long time - so I
wrapped it in time() calls:
time1 = time.time()
blah = rowA.b.someRow
print time.time() - time1

What I find is that when I run this in Python, it takes ~0.01 seconds
per object, but when I execute it directly in the database:
EXPLAIN ANALYZE SELECT *
FROM a
WHERE a.b_pk = 20;

It only takes ~0.01 milliseconds! Is there some optimization I can do
from within the Model Class definitions, or do I really need to
execute raw sql from my code to get raw speed?

Thanks,
Adrian

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.



Re: [sqlalchemy] sqlalchemy speed help

2011-05-02 Thread Michael Bayer

On May 2, 2011, at 11:14 AM, Adrian wrote:

 I'm facing some interesting speed issues with my database that only
 seem to crop up within sqlalchemy. I have 2 tables in a one-to-one
 relationship, with about ~1 million rows each. From Python, I grab an
 object from one table (table A):
   rowA = session.query(A).limit(1).one()
 
 And then access a row in table B:
   blah = rowA.b.someRow
 
 I noticed that for ~500 of these, it started taking a long time - so I
 wrapped it in time() calls:
   time1 = time.time()
   blah = rowA.b.someRow
   print time.time() - time1
 
 What I find is that when I run this in Python, it takes ~0.01 seconds
 per object, but when I execute it directly in the database:
   EXPLAIN ANALYZE SELECT *
   FROM a
   WHERE a.b_pk = 20;
 
 It only takes ~0.01 milliseconds! Is there some optimization I can do
 from within the Model Class definitions, or do I really need to
 execute raw sql from my code to get raw speed?

a. using EXPLAIN ANALYZE does not take time spent fetching rows, network 
overhead,  or the communication between the DBAPI and the database into account 
.   A more apt comparison would be against raw DBAPI access using 
connection.cursor() where all rows are fetched.
b. turn on echo=True, see what SQL is being emitted.
c. assuming every rowA.b.someRow is a lazyload of the related row, you are 
executing 2x as many queries.   Use eager loading:  
http://www.sqlalchemy.org/docs/orm/loading.html
d. it is faster to load individual columns, that is sess.query(cls.id, 
cls.name), rather than the whole object, i.e. sess.query(cls).  The latter has 
a lot more bookkeeping to perform.
e.  Emitting hundreds of single object queries is by far the least efficient 
way to get data back, it would be much better if you could emit fewer queries 
to load records in batches of 1000 or so.
f. ORMs add lots of overhead as the cost of automation and state management, 
not unlike Python itself does at the cost of high level, easy to use objects 
instead of writing raw C code.   Some perspective on this specific to 
SQLAlchemy is described here:  
http://techspot.zzzeek.org/2010/12/12/a-tale-of-three-profiles/






 
 Thanks,
 Adrian
 
 -- 
 You received this message because you are subscribed to the Google Groups 
 sqlalchemy group.
 To post to this group, send email to sqlalchemy@googlegroups.com.
 To unsubscribe from this group, send email to 
 sqlalchemy+unsubscr...@googlegroups.com.
 For more options, visit this group at 
 http://groups.google.com/group/sqlalchemy?hl=en.
 

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.