Sorry, this may look a bit familiar.

Table structure:
CREATE TABLE tb_file (tb_file_key INTEGER NOT NULL PRIMARY KEY
AUTOINCREMENT , basename TEXT, extension TEXT, path TEXT, deleted
INTEGER default 0 );

Index:
CREATE INDEX fullpath_idx on tb_file (basename, extension, path, deleted);

Example insert:
INSERT INTO tb_file (basename, extension, path) VALUES ('aa', 'bb', 'cc');

Query:
SELECT tb_file_key, basename, extension, path FROM tb_file WHERE
 basename GLOB 'a*' AND  extension GLOB 'b*' AND path GLOB 'c*' AND
deleted = 0 ORDER BY tb_file_key DESC;


It's basically something to track existing files on a file system for
an embedded device.
As new files are added, new entries are made, and when files are
removed the deleted column is set to 1 (Only one writer process, 5
readers).  There is not any type of VACUUM since there is not any
shortage of space and the readers need access nearly all the time.

My query gets slower as the table grows larger.  The count of the
deleted = 0 remains relatively constant while the virtually deleted
(=1) grows.   At 3000 deleted and 75 not, the query runs 4-5 times
slower then when just the 75 not.   The data lookup does not need to
necessarily fast, while I prefer to minimize the growth in query .

Some solutions I am looking at to minimize
1.   Delete aged entries.
2.   Delete aged entries and enable a vacuum mode that does not starve readers.
3.   Create index on deleted, use that to create a TEMP table on which
the query is run.
4.   Optimize the query, part we have discussed already to remove the GLOB.
5.   Fix? the index?

Can I dismiss any of these right of the bat?   I'm a little baffled
with 4 and 5 and may need a couple suggestions.

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

Reply via email to