Hi to all,
I have a table with many record, that have a field normally with value '0'.
Occasionally i update some records by setting the field to '1' to mark
it, and after in a background job, i localized them for working on it.
For that, i have an index on that field.
My problem: if i run an "analyze" when all records have the field equal
to '0', the localization (select .. where field != 0) don't use the
index, and do a full-table-scan.
If at least one record is set to '1', the index are used.
It's seem that "analyze" discover that all records have same field
value, so mark the index "useless".
Solutions that i know:
- run "analyze" after updating to '1' some records. :(
- maintain at least one fake record with '1' :(
- never launch "analyze" :(
Or... (please help!)
- exists some options to control this behiavour of analyze?
- it's possible to force the use of the index?
Thanks for feedback!
-- Test case:
-- Creating test table
CREATE TABLE os_test
(
code int NOT NULL,
mark int NOT NULL,
PRIMARY KEY (code)
);
-- Creating an index
CREATE INDEX os_test_index_mark ON os_test (mark);
-- Filling with some data
insert into os_test values ('a',0);
insert into os_test values ('b',0);
insert into os_test values ('c',0);
-- Testing indexes
explain query plan
select code from os_test where mark == 1
-- Result: "TABLE os_test WITH INDEX os_test_index_mark"
-- Right.
-- Launch "analyze"
analyze
-- Re-Testing indexes
explain query plan
select code from os_test where mark == 1
-- Result: "TABLE os_test"
-- Wrong.
-- Updating one record
update os_test set mark=1 where code='a'
-- Re-Testing indexes
explain query plan
select code from os_test where mark == 1
-- Result: "TABLE os_test"
-- Wrong.
-- Re-Analyze
analyze
-- Re-Testing indexes
explain query plan
select code from os_test where mark == 1
-- Result: "TABLE os_test WITH INDEX os_test_index_mark"
-- Right.
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users