On Jun 27, 2011, at 11:18 AM, Mohit Sindhwani wrote:
> select * FROM Objects, Objects_Index
> WHERE Objects.id = Objects_Index.id
> AND minx <= 668632 + 250 AND maxx >= 668632 - 250
> AND miny <= 1518661 + 250 AND maxy >= 1518661 - 250
> AND CAT=25;
>
> Doing an explain query plan revealed that SQlite was scanning Objects
> with the IDX_OBJ_CAT first and then using the R-Tree. Without
> restricting by CAT, we found the query was much faster and was using
> only the virtual R-Tree index.
>
> We wanted to get SQLite to use the R-Tree first, so we tried a few
> different things - eventually, we killed the IDX_OBJ_CAT index and the
> query became (yes, wait for it) almost 100x faster!
Try something like
SELECT *
FROM (
SELECT * FROM Objects, Objects_Index
WHERE Objects.id = Objects_Index.id
AND minx <= 668632 + 250 AND maxx >= 668632 - 250
AND miny <= 1518661 + 250 AND maxy >= 1518661 - 250
)
WHERE CAT=25;
You might have to prefix the columns with the appropriate table names (I can't
tell which table cat and the bounds are coming from). If the bounds are a part
of the Objects table, you could try
SELECT *
FROM (
SELECT * FROM Objects
WHERE minx <= 668632 + 250 AND maxx >= 668632 - 250
AND miny <= 1518661 + 250 AND maxy >= 1518661 - 250
) foo, Objects_Index
WHERE foo.Id = Objects_Index.id AND CAT=25;
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users