Einzelnen Beitrag anzeigen

jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#14

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 12:57
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 = 'EZor SLAVE.ZusatzStatus = 'EVor
               SLAVE.ZusatzStatus = 'EFor SLAVE.ZusatzStatus = 'EAor
               SLAVE.ZusatzStatus = 'EQor 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 = 'Wartenor
               SLAVE.SlaveStatus = 'Unterbrochenor
               SLAVE.SlaveStatus = 'In Arbeitand SLAVE.Dzusatz is NULL) or
               (SLAVE.SlaveStatus = 'In Abreitand
               SLAVE.Dzusatz = 'Gesperrtand
               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?
Gruß, Jo

Geändert von jobo (23. Jun 2016 um 12:59 Uhr)
  Mit Zitat antworten Zitat