On Jul 11, 2007, at 2:02 PM, Justus Pendleton wrote:
I've noticed some large (10x) performance differences between
sqlalchemy (no
ORM) and plain DB API when using sqlite and was wondering if that is
something expected even when I'm (trying to) avoid the ORM stuff or
if I'm
just doing something wrong.
We have lots of CSV files and I wanted to turn each file into a
sqlite db to
make another project easier. I wrote an importer using the raw sqlite3
dbapi and then again using sqlalchemy (no ORM I hope). All the
importer
does is loop over the lines of the file and insert rows into the
database.
The raw dbapi version can insert ~5000-7000 rows per second whereas
the
sqlalchemy version does about ~300-500 rows per second.
When I turned on metadata.engine.echo I didn't see sqlalchemy doing
anything
beyond what I expected it to; just a bunch of inserts followed by a
commit
when I tell it to.
Is this performance disparity expected?
you should definitely call it via executemany() semantics, where you
issue just a single execute() call (or a small set of them), each one
containing a list of parameter sets to be inserted. the form is the
last example here: http://www.sqlalchemy.org/docs/
sqlconstruction.html#sql_insert . using this method, all of the
overhead of compiling and executing within SQLAlchemy is cut down to
a negligble amount and the work is placed almost totally within the
DBAPI. you also optimize the operation on the database side, as
various databases can pre-prepare a statement handle that is used
repeatedly.
the performance overhead by calling individual executes() is that of
compiling the statement into a string each time, creating an
execution context, doing some guesswork on the given bind parameters
and checking for defaults, and then executing. a lot of automatic
stuff is done for you. like ants said, you can reduce the compile
overhead by compiling the statement ahead of time:
statement = table.insert().compile()
--~--~-~--~~~---~--~~
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 [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---