On Sat, Mar 20, 2010 at 3:32 AM, Vasyl Pasternak <vasyl.paster...@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
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe