----- Forwarded by Ben Carlyle/AU/IRSA/Rail on 04/11/2003 02:26 PM -----

Ben Carlyle
04/11/2003 02:01 PM


        To:     Doug Currie <[EMAIL PROTECTED]>
        cc: 
        Subject:        Re: Re[2]: [sqlite] Performance problem






Doug Currie <[EMAIL PROTECTED]>
03/11/2003 05:39 AM
Please respond to Doug Currie

 
        To:     [EMAIL PROTECTED]
        cc: 
        Subject:        Re[2]: [sqlite] Performance problem


> > Can any readers suggest ways that I have not thought of for making
> > large numbers of non-localized INSERTs go faster?

> Instead of journaling the old ("undo") pages of idx2, simply record
> the fact that idx2 is modified (i.e., make a single record in the
> journal). Upon recovery, noticing that idx2 is modified will cause it
> to be recreated from the rolled-back data.

I've been thinking about his for a while and I think the solution, as with 
many other potential sqlite performance issues is to solve it in the 
operating system, not sqlite it's self. If you don't have enough bandwidth 
to your file, raid it. If you want to be able to write a large number of 
transactions per second using journalling that lazily writes to the 
database enable data-journalling on your filesystem.

This is a couter-intuitve approach. When you apply data journalling on a 
filesystem such as linux's ext3 the operating system writes all data to a 
journal before writing it to the appropriate locations on disk. You may 
think that because its being written twice (four times in the case of 
sqlite, because the journal will be written twice and the file will be 
written twice) it will take longer to work. When you use fsync() alot the 
opposite is actually true. You get the behaviour that other list members 
have been discussing with the combined undo/redo log. The data updates are 
written sequentially by the operating system to disk so seek-time doesn't 
come into it, and the fsync() simply ensures that your file has been 
written to the sequential log. The operating system it's self deals with 
the lazy writing to the actual disk, and it's transparent to sqlite 
because the operating system cache makes it appear that its already been 
written.

This only works when you use all-data journalling, not just meta-data like 
directory entries, and regular writes to the same filesystem might be a 
little slower... but try it. You should get better performance with 
data-journalling and sqlite.

As this is a problem that can be solved very nicely indeed in the 
operating system I think that sqlite should make no special provisions for 
it. I do suggest that the relevant FAQs should contain the instruction to 
use a data-journalled fs if a large number of transactions must be pushed 
through sqlite.

Benjamin.

Reply via email to