On 1/31/2015 12:21 AM, Godmar Back wrote:
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.
That's a quadratic algorithm you have here. In order to start reading
from the b-th record, SQLite needs to read and discard the previous b
records. You would be better off with a "WHERE id > $LastID ORDER BY id
" clause, where $LastID would be the key of the last record in the
previous chunk.
Better still, switch to WAL mode ( https://www.sqlite.org/wal.html ) It
allows readers to work simultaneously with a single writer. Then just
run a single query across the whole table.
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?
Do you ever delete records from this table? If you don't, you can get a
count with
select max(rowid) from mytable;
That should be nearly instantaneous. If you do delete rows, and all you
need is a quick count, then I would suggest adding an ON INSERT and ON
DELETE triggers that would update a count stored in a separate,
singleton table.
I'm not sure what you mean by "dump an approximate snapshot".
--
Igor Tandetnik
___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users