Zu Ergebnis = 48 Stück.
Ich weiß nicht, wie der Optimizer von
FB tickt. Aber ich würde versuchen, ihm zu helfen und folgende Strategie anwenden:
Die Kriterien, die die heftigste Einschränkung liefern für ein Kern-Select-Statement verwenden. (Das sind vielleicht bereits die bloßen Joins) Sodass ein grobes Ergebnis auf weniger als 5000 Datensätze kommt, darf auch weniger sein.
Auf dem Rest dann den ganzen Schnickschnack mit like '%' Or / in () usw. Mglw. geht das, wenn man das Kernselect klammert und außen dann die restlichen Kriterien abfragt.
So ungefähr (vorschlag):
Delphi-Quellcode:
select *
from (
select *
from MASTER
Left Outer JOIN SLAVE
on MASTER.Vorgangsnummer = SLAVE.Vorgangsnummer
and (SLAVE.ZusatzStatus = 'EZ' or SLAVE.ZusatzStatus = 'EV' or
SLAVE.ZusatzStatus = 'EF' or SLAVE.ZusatzStatus = 'EA' or
SLAVE.ZusatzStatus = 'EQ' or SLAVE.ZusatzStatus = 'EP')
Left Outer Join MASTER UrMaster
on MASTER.Vorgangursprung = UrMaster.Vorgangsnummer
where MASTER.Status = 'In Bearbeitung'
and SLAVE.SlaveNummerr is not NULL
and ((SLAVE.SlaveStatus = 'Warten' or
SLAVE.SlaveStatus = 'Unterbrochen' or
SLAVE.SlaveStatus = 'In Arbeit' and SLAVE.Dzusatz is NULL) or
(SLAVE.SlaveStatus = 'In Abreit' and
SLAVE.Dzusatz = 'Gesperrt' and
SLAVE.Sollende < Current_Date))
and MASTER.FATW = 'Aktive'
) as Kernselect
where (( (Kernselect.AltesSystem like 'Start%' or Kernselect.AltesSystem like 'Vorgang%')
and Kernselect.AltesSystem not like '%Abbruch%'
and Kernselect.Storno is null
)
or
(Kernselect.referenznr = 'ABT_25')
)
Wie man genau die Kriterien nach innen oder außen legt, muss anhand des Ausführungsplans oder Try/Error bestimmt werden. Ach und nochmal die Frage: Sind es wirklich alles Outer Joins oder vielleicht doch feste Joins? Ändert sich die Ergebnismenge, wenn Du feste Joins draus machst?