Hi, All!

I've got a database containing single table with a dozen of columns and some 
indices like that:

CREATE TABLE T(X, Y, Z, ..., UNIQUE (X, Y, Z, ...) ON CONFLICT IGNORE);
CREATE INDEX IX ON T(X);
CREATE INDEX IY ON T(Y);
CREATE INDEX IZ ON T(Z);
.....

Data in the different columns are small positive integers, 32-bit integers 
or few-bytes blobs. Neither of the X, Y, Z, ... are unique by themselves, 
only their combination is unique (that's why I opt using relational database 
to process them). My application treats this table as append-only, that is, 
doing either INSERT or SELECT on it, without any UPDATEs. Few millions of 
inserts are wrapped in a single transaction in order to reduce journal usage. 
Total number of records in the table is more than 10^10, so it doesn't fit 
in any RAM. PRAGMA CACHE_SIZE is adjusted to use most of the available memory. 
Journal file (of enough size to hold all the pages dirtied by a biggest 
transaction) is created in advance and PRAGMA JOURNAL_MODE is set to PERSIST 
in order not to bother operating system with creating/deleting files. Page
size is matched to the underlying filesystem block size and to the stripe
size of RAID containing that filesystem. Sqlite version is now 3.7.3, but 
it seems that exact version doesn't matter.

When trying to insert data already present in the table, performance is 
fairly well, most of the CPU time is spent only on parsing SQL statements 
and converting data to internal format, while database operation itself 
(that is checking data against the constraint) is almost instantaneous, 
which is quite impressive given the table size. But when the application 
inserts new data, things change drastically: total throughput drops by a 
2-3 orders of magnitude. CPU is staying almost idle, and all time is spent
waiting for disk _reading_ (rarely interspersed with fast and happy write
bursts on each COMMIT). What is sqlite reading there? Does it try to 
perfectly balance each index on each insert (million times per 
transaction) or something else?

Sincerely,
Valentin Davydov.
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to