On Sat, Apr 17, 2010 at 05:27:35PM -0700, andrew fabbro scratched on the wall:
> If a DB is entirely in-memory (i.e., opened with :memory:), which pragmas
> can be used to improve performance?
>
> (1) I assume synchronous = OFF is desirable
N/A. There is no such thing as synchronizing memory writes.
> (2) I'm guessing journal_mode = MEMORY is already set.
No need to guess. Docs:
"Note that the journal_mode for an in-memory database is either
MEMORY or OFF and can not be changed to a different value."
> Is journal_mode = OFF another possible speed gain? Of course, then
> one loses the ability to do transactions.
If it is, it is likely to be very minor.
> (3) If journaling is set to MEMORY, what is the best setting then for
> journal_size_limit?
N/A. Only applies to on-disk journals.
> I guess it depends on how much memory one is willing to
> use overall, but in this case, it's not there for crash protection but
> rather to support transactions. Is there a sizing guide?
JOURNAL_SIZE_LIMIT doesn't limit the size of an active journal, only
left-over journals.
Docs:
"This pragma may be used to limit the size of journal files left in
the file-system **after** transactions are committed..." [emp. added]
> (4) How about locking_mode? I imagine it would be OK and a small gain to
> set to NORMAL in a single-threaded application, but obviously not a good
> idea for multi-threaded.
Docs:
"The "temp" database (in which TEMP tables and indices are stored)
and in-memory databases always uses exclusive locking mode."
Multi-threaded has nothing to do with it. Even with multi-thread you
still have to sync your use of the database connection.
> (5) If referential integrity can be sacrificed (the Oracle DBA in my
> whimpers a little), foreign_keys = false, but that's true whether on-disk or
> in-memory.
Yes. But if you don't have FKs, it is unlikely to make much difference.
> (6) Is there any advantage to playing with:
> - page_size?
Doubt it. Unless you're storing a lot of TEXT/BLOB values that are
just slightly larger than a page, and getting a lot of fragmentation,
there isn't likely to be much difference.
If you're memory bound a slightly larger page is likely to help, but
that's a big balancing act that depends a lot on the data and layout
of the database.
> - default_cache_size?
N/A. This only comes into play when a database is re-opened. You
can't do that with an instance of an in-memory DB.
> - read_uncommitted? I assume there's a different answer for single- vs.
> multi-threaded (or rather, depending on how readers/writers interact)
N/A. This only applies to shared-cache mode. Shared cache mode only
applies when you have multiple connections to the same database. You
can't have multiple connections to an in-memory instance.
-j
--
Jay A. Kreibich < J A Y @ K R E I B I.C H >
"Our opponent is an alien starship packed with atomic bombs. We have
a protractor." "I'll go home and see if I can scrounge up a ruler
and a piece of string." --from Anathem by Neal Stephenson
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users