[Haskell-cafe] Takusen sqlite3 insert is very slow
Jason Dagit
dagit at codersbase.com
Sat Mar 20 12:36:53 EDT 2010
On Sat, Mar 20, 2010 at 3:32 AM, Vasyl Pasternak
<vasyl.pasternak at gmail.com>wrote:
> Hi Cafe,
>
> I have another problem, please look at code:
>
> storeInDb = withSession (connect "test.db")
> (do
> execDDL (sql "create table x (y int)")
> forM_ ([1..10000] :: [Int])
> (\x -> do
> execDML (cmdbind ("insert into x (y) values (?);")
> [bindP x])
> return ()))
>
> This code runs 16 seconds which is very slow for this simple task. RTS
> output is below. After profiling this program I found that 85% of its
> time it spends in 'Database.Sqlite.SqliteFunctions.stmtFetch'.
> Currently I don't know how to make it faster, maybe anyone had this
> problem later?
>
> HDBC inserts very fast, so this is not sqlite error.
>
Can you show the HDBC version? Maybe they make different assumptions about
transactions or fetching the number of affected rows?
If I'm reading the source of takusen correctly it's using a different
transaction for each insert and stmtFetch is getting called to return the
number of rows inserted. Which should be 1 every time and for your
purposes, ignorable. You should be able to change to execDDL, but I
seriously doubt that will have any impact on performance. It looks like the
only difference between execDDL and execDML is that execDDL has ">> return
()" at the end of it.
You might try running your inserts inside withTransaction. The default
behavior of sqlite is to use a separate transaction for each statement.
Perhaps this is adding overhead that shows up during stmtFetch.
How long does your HDBC version take? Is it a factor of 10? Factor of 2?
Jason
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100320/4f77e8f7/attachment.html
More information about the Haskell-Cafe
mailing list