Wenn man einen Left Join nutzt und die linke Tabelle eher klein ist, sollte normalerweise der Optimierer den rechten Ausdruck ohnehin höchstens für die links auftretenden Werte berechnen.
Wenn man Views nutzt, kann es passieren, daß die Indices nicht mehr verwendet werden. Da müßte man sich den Ablaufplan der ganzen Abfrage ansehen.
ChristophSchmid:Aktuell habe ich z.B. die Abfrage(Tippfehler seien verziehen)
Select * from a left outer join (select * from c union select * from d) as b where a.id=b.id and a.id=40
Die
interne Abfrage mit dem union ist in wirklichkeit komplizierter und
dauert recht lange. Habe daher gehofft, dass ich mit der übergabe vom
id-Wert die UNION-Abfrage bereits da klein halten kann. Die Abfrage
wird dann selber wieder in einer View genutzt und da kommt dann der 40
aus dieser Spalte.
Korreliertes Verwenden eines 'äußeren Wertes' geht nur bei korrelierten Unterabfragen. Wenn das Gesamtkonstrukt selbst innerhalb einer übergeordneten Struktur in Form einer Unterabfrage genutzt wird,dann kann das drumherum seinen Wert X.id an verschiedene Stellen (Where-Klausel außen und innen) durchreichen. Damit dürfte der innere Join-Ausdruck auch bloß noch das berechnen, was er soll.
PS: Left Join mit On formulieren, also
Select * from a left outer join (select * from c union select * from d) as b On a.id=b.id Where a.id=40
Womöglich löst der Abfrageoptimierer dieses etwas untypische Konstrukt komisch auf (hängt m.W. nach auch von der Lizenz ab).