Don't know how SQLite should behave in this case, but seems logical to me that A and B would force that A is always evaluated, and B is evaluated only if A is true. I would change the order of the two betweens:
SELECT itemID FROM t WHERE createdAt BETWEEN '2011-08-01' AND '2011-08-02' AND itemID BETWEEN 1000000 AND 2000000 > Hi all, > > I have a table like this: > > CREATE TABLE t (itemID INTEGER PRIMARY KEY, createdAt DATETIME); > CREATE INDEX createIdx on t(createdAt); > > SQLite is compiled using SQLITE_ENABLE_STAT2 and table is ANALYZEd with > current content. > > When perfoming a Statement like this: > > SELECT itemID FROM t WHERE itemID BETWEEN 1000000 AND 2000000 AND > createdAt BETWEEN '2011-08-01' AND '2011-08-02' > > the analyzer always chooses the rowid index which results in a scan over > one million rows. It would have to scan only a few dozen rows if it > chose createIdx instead (which is also a covering index). Looking at the > sqlite_stat2 table shows that there is no data for the rowid index. > Could this be the reason for the suboptimal query plan? The choice works > as expected if itemID is a regular column with an index on it. > > regards > gerd > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users