>So if I build a view that includes look-ups in other tables, the
>optimizer may skip these at places where not selected. However only if
>the look-ups are written as outer joins. Then it may be good practice
>allways doing that. For instance:

>create view vtrack as
>select  trackname, artistname
>from track
>left join artist ON trackartist=artistid -- note left join
;
~
~

Yeah, I was thinking always to use left joins when it doesn’t make any 
difference. I’m using a C++ wrapper for SQLite I wrote myself. It contains a 
QueryGrid type that automatically splits the SQL into RowSQL and ColSQL as 
described earlier. It is still possible to build a vector of BaseTbl.RowIDs 
when the original query contains inner joins provided all columns of the unique 
index used in the join are satisfied (see ***Example). If it’s unable to do 
that (due to 1 to many joins)  it computes ‘select count(*) from .....’ and 
sets ColSQL to ‘select ColList from ... limit ?1, ?2’ so that it still fits in 
with the ‘fetch a range of data’ modus operandi and also allows a record 
counter and vertical scrollbar positioning.

***Example

select ColList
from BaseTbl
left join Tbl_1 on Tbl_1.X = BaseTbl.X
Inner join Tbl_2 on Tbl2.Y = BaseTbl.Y
left join Tbl_3 on Tbl3.Z = BaseTbl.Z
where BaseTbl.Col=?

Provided Tbl_2 has unique index on Y the RowID list could be had from

Select BaseTbl.RowID
from BaseTbl
left join Tbl_1 on Tbl_1.X = BaseTbl.X
Inner join Tbl_2 on Tbl2.Y = BaseTbl.Y
left join Tbl_3 on Tbl3.Z = BaseTbl.Z
where BaseTbl.Col=?

which the SQLite query optimiser would presumably reduce to

Select BaseTbl.RowID
from BaseTbl
Inner join Tbl_2 on Tbl2.Y = BaseTbl.Y
where BaseTbl.Col=?

I’ve still to write code to check the query contains no joins that are ‘1 to 
many’. I don’t suppose there’s an easy way of determining this from explain or 
explain query plan? At the moment all i can think of is to scrape the index 
name from the explain query plan Detail column, check the number of variables 
involved (i.e. number of ? marks) and compare with the number of columns in the 
index.

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

Reply via email to