Thank you. This is what I wanted to hear. And as you already saw from
responses, fragmentation is far from your main problem. I'd like to
point to one particular issue:

> However, we're starting to see problems.  There is so much activity on some
> servers that there is never a chance for our checkpointing thread to do its
> thing, so our WAL file often ballons up to 30GB or more.  This makes query
> times plummet.

Looking at this problem alone I'd say SQLite is not the right tool for
you. At least at the scale you are working now. And I don't know all
your arguments but I hope you are arguing not just because you are a
fan of SQLite and don't want to move away from it.

Pavel


On Sun, Oct 28, 2012 at 7:48 AM, David Barrett <dbarr...@expensify.com> wrote:
> Wow, I didn't realize this was such a controversial question.
>
> I'm a huge sqlite fan.  Expensify is built on sqlite.  We have a 40GB
> database, replicated using our custom distributed transaction layer across
> 5 severs in three different datacenters.[1]  It's been powering all of
> Expensify (including our direct deposit reimbursement engine and credit
> card import layer -- both of which contain incredibly sensitive
> information, with mistakes causing millions of dollars to move in the wrong
> direction).  On the back of sqlite, we've grown to over million users,
> processing millions of dollars in expense reports every day.
>
> However, we're starting to see problems.  There is so much activity on some
> servers that there is never a chance for our checkpointing thread to do its
> thing, so our WAL file often ballons up to 30GB or more.  This makes query
> times plummet.  We regularly checkpoint manually, and often vacuum, all in
> an effort to keep queries moving quick.  We also do things to trick out our
> indexes in order to ensure proper disk ordering, pay particular attention
> to block and cache amounts, etc.  This isn't premature optimization for the
> sake of having fun, these are in response to real performance problems
> affecting our product.
>
> In light of that, there is a contingent pushing to drop sqlite in favor of
> MySQL.  There are a wide range of reasons -- it has its own replication,
> better write concurrency, clustered indexes, and better edge-case data
> integrity (because we use 2 DBs and WAL, ATTACH doesn't provide atomic
> commit advantages).  And for each I have a corresponding answer -- MySQL's
> replication isn't as good as ours, concurrency doesn't matter because we
> serialize writes and have a single threaded server anyway, clustered
> indexes would be nice but we can get close enough with custom ROWIDs, and
> the extremely rare situation where there's a cross-database integrity
> problem, we can detect and recover from any of the other slaves.  And I
> also add in that sqlite can never crash because it's built into the server;
> its performance is fantastic because it runs in the same process; in years
> of operation we've never once seen it corrupt data; it's so easy to use;
> etc etc.
>
> But there's an argument I've heard come up to which I don't have a
> response: MySQL handles fragmentation better, and by extension would give
> us better performance on the same hardware.   I'd like to know more about
> it, which is why I've asked.  Thanks!
>
> -david
>
> [1] http://permalink.gmane.org/gmane.comp.db.sqlite.general/71868
>
>
> On Sun, Oct 28, 2012 at 2:12 PM, Pavel Ivanov <paiva...@gmail.com> wrote:
>
>> OK. Curiosity is a good thing in certain situations. But could you
>> kindly tell me what will you do with this information (assuming it's
>> possible to obtain it of course)?
>>
>> Pavel
>>
>> On Sat, Oct 27, 2012 at 11:54 PM, David Barrett <dbarr...@expensify.com>
>> wrote:
>> > I completely understand the wide and varied differences.  I'm just *also*
>> > interested in this very specific issue.
>> >
>> > -david
>> >
>> > On Sun, Oct 28, 2012 at 12:38 PM, Pavel Ivanov <paiva...@gmail.com>
>> wrote:
>> >
>> >> > That said, I'd still welcome any quick summary of the differences
>> between
>> >> > sqlite and mysql when it comes to fragmentation.
>> >>
>> >> This is far from main differences between sqlite and mysql that you
>> >> should consider if you want to choose between them unless of course
>> >> your question is just about an academic interest. As you are talking
>> >> about employees I guess you are not in some purely academic exercise.
>> >> In this case think more about in-process code vs pumping through
>> >> TCP/IP stack, designed mostly to be accessible from machine-local
>> >> processes only vs accessible to anyone on the network, plain access to
>> >> everything vs versatile and complicated authorization and
>> >> authentication mechanisms, and so on and so forth. Database format is
>> >> never a part of the decision which DBMS you want to use.
>> >>
>> >> Pavel
>> >>
>> >>
>> >> On Sat, Oct 27, 2012 at 9:32 PM, David Barrett <dbarr...@expensify.com>
>> >> wrote:
>> >> > Thanks, this is really helpful!  (And I lecture my employees about the
>> >> > evils of premature optimization all the time.  In fact, I'll lecture
>> >> anyone
>> >> > in earshot, so frequently that it's the butt of jokes.)
>> >> >
>> >> > That said, I'd still welcome any quick summary of the differences
>> between
>> >> > sqlite and mysql when it comes to fragmentation.  I often get in
>> debates
>> >> > about sqlite versus other datbases, and I'm always eager to be
>> informed.
>> >> >  Thanks!
>> >> >
>> >> > -david
>> >> >
>> >> > On Sat, Oct 27, 2012 at 11:42 PM, Simon Slavin <slav...@bigfraud.org>
>> >> wrote:
>> >> >
>> >> >>
>> >> >> On 27 Oct 2012, at 11:38am, David Barrett <dbarr...@expensify.com>
>> >> wrote:
>> >> >>
>> >> >> > I'm trying to learn more about MySQL versus sqllite when it comes
>> to
>> >> >> > vacuuming and fragmentation, especially as it relates to SSD
>> storage.
>> >> >>
>> >> >>
>> >> >> Rather than answer your questions point-by-point, I'm going to give
>> you
>> >> >> the current state of play.  Your understanding of how the various
>> DBMSes
>> >> >> work is right, but your excellent question "in a world with SSDs and
>> a
>> >> >> tremendous amount of RAM, does vacuuming matter nearly as much as on
>> a
>> >> >> spinning disk with constrained RAM?" cuts to the heart of all your
>> other
>> >> >> points.  The following involves a little simplification and
>> handwaving
>> >> >> because otherwise it would be two chapters long and you'd have to do
>> >> >> homework.
>> >> >>
>> >> >> Fragmentation made a big difference to apps running on Windows, but
>> very
>> >> >> little on any other platform.  This is because Windows does something
>> >> >> called 'read-ahead caching' which assumes that if you read block B,
>> >> you're
>> >> >> soon going to want to read block B+1, so at quite a low level it
>> >> helpfully
>> >> >> pre-reads it for you.  Other operating systems don't make this
>> >> assumption.
>> >> >>  This is why Windows users talk about defragmentation so much, but
>> Unix
>> >> >> users don't care about it.
>> >> >>
>> >> >> SSDs negate the whole point of defragmentation.  On a rotational disk
>> >> it's
>> >> >> faster to read blocks B, B+1, B+2, B+4, B+5 than it is to read five
>> >> random
>> >> >> blocks from the disk, because the read heads are already positioned
>> in
>> >> the
>> >> >> right place, and the disk is going to rotate to show those five
>> blocks
>> >> in
>> >> >> order.  SSDs are just like RAM: they're Random Access Memory.
>>  Reading
>> >> any
>> >> >> five blocks in any order takes roughly the same time.  So nobody
>> cares
>> >> >> about fragmentation on an SSD.  Read whatever blocks you want in
>> >> whatever
>> >> >> order you want.
>> >> >>
>> >> >> As to clever management of disk block alignment with respect to rows
>> and
>> >> >> columns, this is rarely worth attention these days.  The amount of
>> >> >> programming and debugging time it takes to get this right, and the
>> >> amount
>> >> >> of extra processing and disk access you need to do, give you less
>> >> return on
>> >> >> investment than if you spent the same money on buying a faster hard
>> >> disk.
>> >> >>  It's "premature optimization" (look up the term) except for two
>> cases:
>> >> >> overnight runs and realtime 3D graphics.  If your overnight run takes
>> >> more
>> >> >> than one night, you have a problem.  If you're programming realtime
>> 3D
>> >> >> graphics and they're jerky, your users won't enjoy your simulation.
>>  But
>> >> >> you wouldn't be using a SQL engine for 3D graphics anyway.
>> >> >>
>> >> >> The matters you mentioned were all worth attention back in the 1980s
>> >> when
>> >> >> storage and bandwidth were expensive.  As you pointed out near the
>> end
>> >> of
>> >> >> your post, these things matter less now.
>> >> >>
>> >> >> Simon.
>> >> >>
>> >> >> _______________________________________________
>> >> >> sqlite-users mailing list
>> >> >> sqlite-users@sqlite.org
>> >> >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>> >> >>
>> >> > _______________________________________________
>> >> > sqlite-users mailing list
>> >> > sqlite-users@sqlite.org
>> >> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>> >> _______________________________________________
>> >> sqlite-users mailing list
>> >> sqlite-users@sqlite.org
>> >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>> >>
>> > _______________________________________________
>> > sqlite-users mailing list
>> > sqlite-users@sqlite.org
>> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to