Subject Left Outer Join - Plan - FB1.5
Author Michael Vilhelmsen
Hi

We have a FB 1.5.3 running on a Win32 machine.

When doing this query:

SELECT
Transaktioner.Dato,
Transaktioner.LEVNAVN,
jTabel.V509INdex,
Transaktioner.VAREGRPID,
Transaktioner.STOERRELSE_NAVN,
Transaktioner.FARVE_NAVN,
Transaktioner.SALGKR,
Transaktioner.SALGSTK,
Transaktioner.MOMSKR,
Transaktioner.KOSTPR,
Transaktioner.VAREFRVSTRNR,
Varer.VareNavn1 as VareNavn
FROM Transaktioner
Inner Join Varer on (Varer.PLU_NR=Transaktioner.VAREFRVSTRNR)
Left Outer Join Leverandoerer jTabel on
(jTabel.NAVN=Transaktioner.LEVNAVN)
WHERE
(Transaktioner.ART=0 OR Transaktioner.ART=1) AND
(Transaktioner.DATO>:PDATO) AND
(Transaktioner.DATO<:PDATOTIL) AND
(Transaktioner.AFDELING_ID=:PAfdeling)
ORDER BY
jTabel.V509INDEX,
Transaktioner.Dato,
Transaktioner.BONNR;


Gives this PLAN:

PLAN SORT (JOIN (JOIN (VARER NATURAL,TRANSAKTIONER INDEX
(TRANS_VAREFRVSTRNR,TRANS_DATO,TRANS_ART,TRANS_ART)),JTABEL INDEX
(RDB$PRIMARY23)))


Sinse our tabel VARER can contain quite some records and the table
TRANSAKTIONER even more this query isn't running so good.



But changing the join order like this (doing the left outer join first)
it returns a diff. PLAN.

SELECT
Transaktioner.Dato,
Transaktioner.LEVNAVN,
jTabel.V509INdex,
Transaktioner.VAREGRPID,
Transaktioner.STOERRELSE_NAVN,
Transaktioner.FARVE_NAVN,
Transaktioner.SALGKR,
Transaktioner.SALGSTK,
Transaktioner.MOMSKR,
Transaktioner.KOSTPR,
Transaktioner.VAREFRVSTRNR,
Varer.VareNavn1 as VareNavn
FROM Transaktioner
Left Outer Join Leverandoerer jTabel on
(jTabel.NAVN=Transaktioner.LEVNAVN)
Inner Join Varer on (Varer.PLU_NR=Transaktioner.VAREFRVSTRNR)
WHERE
(Transaktioner.ART=0 OR Transaktioner.ART=1) AND
(Transaktioner.DATO>:PDATO) AND
(Transaktioner.DATO<:PDATOTIL) AND
(Transaktioner.AFDELING_ID=:PAfdeling)
ORDER BY
jTabel.V509INDEX,
Transaktioner.Dato,
Transaktioner.BONNR;

PLAN:
PLAN SORT (JOIN (JOIN (TRANSAKTIONER INDEX
(TRANSAFD1,TRANS_DATO,TRANS_ART,TRANS_ART),JTABEL INDEX
(RDB$PRIMARY23)),VARER INDEX (RDB$PRIMARY26)))



Now FB uses the Primary Key.

The problem isn't present in FB 2.0.

What I really don't get is, that its the INNER JOIN that suddenly uses
no primary key.
Not the left outer join - which I would have presummed..


Michael



[Non-text portions of this message have been removed]