On 04/29/2016 09:41 PM, Josef Ku?era wrote:
> Hello,
> I have discovered a possible query planner improvement. I am using the SQLite
> with virtual table modules.
>
> Situation 1: Lets have a query like 'SELECT V.* FROM (select A.RowID A_ROWID,
> B.RowID B_ROWID, A.*, B.* from A left outer join B on B.ref=A.key) V WHERE
> V.B_ROWID=?', where A and B are virtual tables. If I am not mistaken the
> WHERE term effectively turns the outer join to an inner join and the query
> could be evaulated as two fast key searches. Unfortunately, currently the
> join is left as is and the execution peforms a sequentail full-scan of the A
> table with many key searches to the B table.
>
> Situation 2: How does SQLite evaluate tables to the left of a left join? As
> it seems it is done by order in the SQL. So query like this: select * from A
> join B on B.ref=A.key left outer join C on C.ref=A.key where C.Value=? causes
> a full scan of A and B before even evaulating C. By looking at the query the
> B table does not seem to be a pre-requisite of table C, although is it marked
> as one in where trace.
At the moment, SQLite processes everything to the left of the LEFT (or
CROSS) JOIN before everything to the right of it.
Dan.