21.08.2015 10:26, 'Louis van Alphen' wrote:
> Dmitry, if I then understand you correctly, if a view contains an outer join,
> then FB will table scan? Is this documented somewhere so that I can read up?
It depends on a number of factors, but generally your conclusion is
correct. The problem is that the join order always starts with a view
with a joined table coming afterwards.
This is a known issue, but unfortunately hard to fix.
> Sure, I look at the plan, but the plan is after the fact. It does not show
> you why?
Right, you cannot see why the optimizer does this or that choice, you
see only the resulting plan.
> Something like:
>
> select S.*
> from COLLECTION_ COLL
> left join SKIN S on S.ID = COLL.SKIN_ID
> where S.ID is not null
>
> i.e. fake the left join to get the correct join order
> (COLLECTION_->SKIN_->COLOUR_).
>
> Not sure what you are doing here and what the where clause does. Are these
> tricks documented somewhere?
This is a quite common trick. For inner joins, possible join orders are
either {COLL->SKIN} or {SKIN->COLL}. We want the join order to be
{COLL->SKIN} but the optimizer decides differently and chooses
{SKIN->COLL}. For outer joins, however, the join order is always
predefined and dictated by the join syntax. So we replace inner join
with left join to guarantee the desired join order {COLL->SKIN}. But we
need to exclude the "false" rows produced by the outer join (records
from COLL having no matches in SKIN), so we add a WHERE clause -- S.ID
is not null -- to remove those unnecessary rows (I assume S.ID is a
primary key and thus it should never be NULL unless produced by the left
join).
Dmitry