On Sat, 31 Jan 2015 00:21:18 -0500, Godmar Back <god...@gmail.com> wrote:

>I have a single SQLite 2-column table with a primary TEXT key and a value,
>like so (id TEXT PRIMARY KEY, value TEXT). One process adds new records
>periodically, perhaps 1-10 per minute. The database currently has 850,000
>entries and is 7.3GB large on disk.

You could benchmark an alternative structure with 
 CREATE TABLE ... ( id TEXT PRIMARY KEY, value TEXT ) WITHOUT ROWID;
http://www.sqlite.org/withoutrowid.html

>I also need to perform bulk queries, which appear to be very slow. On an
>average desktop PC, for instance, a "SELECT COUNT(*)" takes over 5 minutes.

count(*) does a full table scan, which takes time. You could add
ON INSERT/ON DELETE triggers to maintain a running count in a separate table.

>If I want to do a dump of the table, as in "SELECT value FROM ...." I'll
>quickly get "database is locked" errors. Googling revealed that those are
>because a long running select keeps a cursor, and thus readlock on the
>entire database.
>
> I have since rewritten the query using multiple SELECT *
>FROM ... LIMIT a, b where b = 50 and a = 0, 50, 100, 150, .....  However,
>it takes 20 hours to fully extract the table's 850,000 records, with only
>minimal per record processing.

With the LIMIT clause SELECT will usually be slower, especially when ORDER BY
is something else than the primary key.

>My question: is this performance expected, or am I doing something wrong?
>Is there a quick way to count and/or dump an approximate snapshot of a
>single 2-column table such as the one shown above, even while keeping the
>database available for concurrent writes?

You probably should use PRAGMA journal_mode=WAL; , which allows one writer
and many readers concurrently.
http://www.sqlite.org/pragma.html#pragma_journal_mode

Also, have a look at 
http://www.sqlite.org/pragma.html#pragma_busy_timeout

>I'm using Ubuntu 12.10 with 3.7.9-2ubuntu1.1 libsqlite3 using the Python
>binding.

Check whether that the version reported by SELECT sqlite_version(); 
has the features I mentioned above (WITHOUT ROWID and WAL mode);
If necessary, compile your own library from source,
http://www.sqlite.org/download.html (bottom)

Hope this helps.

-- 
Regards, 

Kees Nuyt

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

Reply via email to