Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Sauert zu lange (https://www.delphipraxis.net/189544-sql-sauert-zu-lange.html)

Dumpfbacke 23. Jun 2016 11:30

AW: SQL Sauert zu lange
 
Zitat:

Zitat von jobo (Beitrag 1340840)
Wie groß ist die Basismenge der einzelnen Tabellen und wie groß ca das Ergebnis?
Auf die Schnelle schon mal:
Feste Kriterien wenn mgl. z.B. bei Slave mit in den Join reinpacken (auch wenn es nicht zum Join gehört)
Zitat:

MASTER.AltesSystem not like '%Abbruch%
Möglich kein % am Anfang, bester alle '%Abbruch' Varianten analysieren und aufführen (falls das statisch ist bzw. bleibt)
Bei dem Or von URMASTER sehe ich auf den ersten Blick keinen Ausweg. Muss es wirklich ein Left Outer Join zu Master sein?


Master ca. 414.201 Datensätze
Slave ca. 1.381.415 Datersätze
Ergebnis ca. 48 Datensätze

hstreicher 23. Jun 2016 11:54

AW: SQL Sauert zu lange
 
Bei IBExpert kann man einfach ein(e)/paar Registerkarte weiterklicken und kriegt den Execpution Plan angezeigt sowie die Abruf Statistiken nach Index Reads und nonindexed Read
da sieht mah schnell wo die Zeit verbaucht wird


ggf mal den Plan hier posten

mfg Hannes

Dumpfbacke 23. Jun 2016 12:36

AW: SQL Sauert zu lange
 
Zitat:

Zitat von ibp (Beitrag 1340852)
Zitat:

Zitat von Dumpfbacke (Beitrag 1340836)
...
Wenn ich das ganze ohne die letzte Zeile mache mache dauert es ca. 2 Sekunden. Mit dieser Bedingung dauert es ca. 22 Sekunden.

Wie lange dauert es denn, wenn du die Abfrage nur mit der letzten Bedingung (Zeile) absendest?

[/CODE]

Das führt natürlich zum falschen Ergebnis. Es hat in Summe ganze 15 Minuten benötigt

jobo 23. Jun 2016 12:57

AW: SQL Sauert zu lange
 
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?

Dumpfbacke 23. Jun 2016 13:24

AW: SQL dauert zu lange
 
Zitat:

Zitat von hstreicher (Beitrag 1340884)
Bei IBExpert kann man einfach ein(e)/paar Registerkarte weiterklicken und kriegt den Execpution Plan angezeigt sowie die Abruf Statistiken nach Index Reads und nonindexed Read
da sieht mah schnell wo die Zeit verbaucht wird


ggf mal den Plan hier posten

mfg Hannes

Hier die gewünschten Daten

------ Performance info ------
Prepare time = 32ms
Execute time = 12m 34s 826ms
Avg fetch time = 41.934,78 ms
Current memory = 17.287.612
Max memory = 17.312.136
Memory buffers = 800
Reads from disk to cache = 414.449
Writes from cache to disk = 19.315
Fetches from cache = 14.407.183

Performace Analysis
Slave 34.444
Master 436.807

hstreicher 23. Jun 2016 14:42

AW: SQL Sauert zu lange
 
nein , das sind sie nicht:
Die Gewünschten Daten sind der Execution Plan

in IBExpert

im SQL Editor die 4. Karteikarte Plananalyse
(hier sieht man wo ein Index benutzt wird)

und die 5 Leistungsanalyse
hier die DAten aus dem 2 Karte Additional
(hier sieht an wieviel Daten über den Index gefunden werden und wieviel davon ohne)


mfg Hannes


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz