Hello,

I have a question regarding caching mechanism in SQLite. Especially when using 
multiple connections.
My understanding was that each connection has its own page cache (if I don't 
use SQLITE_OPEN_SHAREDCACHE).
However I wrote some tests and results didn't met my expectations...

So what I tested:
* I have two FTS4 tables (each table contains about million of entries, 10 
columns, 5 columns in the FTS index, 
other columns are used as 'not_indexed')
* My application executes queries (with MATCH operator) to both tables
     * each query is querying only to a single table (no join used) and the 
queries to particular tables are 
mixed so that the order is: run query1 to table1, run query2 to table2, run 
query3 to table1, run query4 to 
table2 and so on)
* The tables are (from the application point of view) READ_ONLY - i.e. the 
content is not modified during the 
application live -> connections opened using 
sqlite3_open_v2(db_path,&p_db,SQLITE_OPEN_READONLY, NULL)
* I wanted to compare performance of my queries with different approaches, the 
complete time to execute all 
queries (10 different queries) was measured:
     1) Run each query with the NEW connection (open connection, execute query, 
close connection):
         * here I expected the worst performance
     2) Run all queries with the same connection (single opened connection 
during the whole test):
         * this was my first implementation and I wanted to improve performance 
to be better then with this approach
         * my assumption was that in this approach the page cache will not be 
reused since the queries are mixed 
and each consecutive query is querying different table
     3) Create two connections (on the same DB) and dedicate each connection 
for queries to a single table:
         * It means that connection1 is used only for queries to table1 and 
connection2 only for queries to table2
         * I expected the best performance here because I thought that each 
connection will keep its own cache 
and therefore the cache will be maximally reused

Results:
The approach 1 was really the slowest. However the approach 3 was unexpectedly 
slightly worse than approach 2.

Moreover, when I run similar tests with another artificial queries which all 
returned lot of entries, the 
approach 1 !!! was even the best -> i.e. almost 10% better than 2 and 3!
And I really cannot understand how it is possible. Does SQLite have yet some 
other global cache?
Or is it possible that "overwriting" the cache content (at least in approach 2) 
can even slow down the query 
time so that it will be slower then using a new connection (=clear cache) for 
each particular query?

Unfortunately I cannot post here exact queries / tables / tests from my project 
(its confidential :-) ) but I 
would like at least to check whether my thinking is correct or if I 
misunderstood something.
Would you expect that the approach 2 will be faster than approach 3? If yes, 
please explain why.

Many thanks,
Milan

Reply via email to