When you're inserting in WAL mode everything will basically have to be written 
twice. First the new page data will be written to the WAL, and then when a 
checkpoint happens the WAL file will be copied over to the main database file.

With rollback journal mode the contents of the original page are written to the 
rollback journal, then the data is written to the main database file. But if 
the page being written to is brand new (because the database size in 
increasing), then there is nothing to be written to the rollback journal, and 
only 1 write needs to happen. (Same if the page being written used to be a free 
page... I think)

So if there's unused room in the file for the inserts, then the two modes 
should be similar, but if it's a brand new database file, or your insert is 
going to grow the file size, then rollback mode will result in fewer writes 
being needed.

So technically the "commit" times are probably similar, but it's probably the 
"checkpoint" time that's killing you. Though I _am_ still curious as to why 
your insert times are twice as long.

(Someone correct me if I'm off on this)


-----Original Message-----
From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> On Behalf Of 
Andrew Cunningham
Sent: Monday, July 01, 2019 2:04 PM
To: SQLite Maillist <sqlite-users@mailinglists.sqlite.org>
Subject: [sqlite] WAL mode much slower in certain use cases

I am using SQLite 3.24.0, as a single user persistent data store for
storing simulation data.

The database can grow to many gigabytes as the software can ingest a lot of
binary data which  I store as multiple BLOBs.

In the following example I am reading several 22GB of data into the DB.

Times in seconds
In WAL mode
Read data & creating DB records 503.227
Commit of transaction,close database  334

In non-WAL mode
Read data & creating DB records 244
Commit of transaction ,close database   4

WAL mode is 80-100x slower to commit to the database.

I am probably abusing WAL mode, but I do not see anything in the
documentation which says "don't use WAL mode in the following use case".

Full disclosure, I am using ODB ( C++ ORM) that hides what is going on
under the hood, but my experience is that in a simple use case like this
ODB is not the problem.

Andrew
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to