Hi list,

I have the following schema:
   CREATE TABLE a(id int primary key);
   CREATE TABLE b(id int primary key);

I want to find information about a particular id, and my query boils
down to something like
   select * from a left natural join (select * from b) where id = 1;
(in the real code, the inner query has a where-clause).

I would expect SQLite to just look up 1 in the indexes for a.id and
b.id. Unfortunately, it does a full table scan:
   sqlite> explain query plan
      ...> select * from a left natural join (select * from b) where id = 1;
   1|0|0|SCAN TABLE b (~1000000 rows)
   0|0|0|SEARCH TABLE a USING COVERING INDEX sqlite_autoindex_a_1 (id=?) (~1 
rows)
   0|1|1|SCAN SUBQUERY 1 (~100000 rows)

However, if I add "where id = 1" to the inner query I get the plan I
want:
   sqlite> explain query plan
      ...> select * from a left natural join (select * from b where id = 1)
      ...> where id = 1;
   1|0|0|SEARCH TABLE b USING COVERING INDEX sqlite_autoindex_b_1 (id=?) (~1 
rows)
   0|0|0|SEARCH TABLE a USING COVERING INDEX sqlite_autoindex_a_1 (id=?) (~1 
rows)
   0|1|1|SCAN SUBQUERY 1 (~1 rows)

I also get a nice plan if I use an inner join instead of an outer
join, or if I replace "select * from b" with just "b" (but, as I
mentioned above, I can't do that in reality).

This happens in SQLite 3.7.9, as well as the latest version from
Fossil. Is it a bug, or am I just expecting too much from the query
optimiser?

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

Reply via email to