AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Sauert zu lange

Ein Thema von Dumpfbacke · begonnen am 23. Jun 2016 · letzter Beitrag vom 23. Jun 2016
Antwort Antwort
Seite 1 von 2  1 2      
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

SQL Sauert zu lange

  Alt 23. Jun 2016, 07:24
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX
Hallo Delphianer,
ich habe ein Problem mit einem Select. Deshalb habe ich hier unten mal einen Auszug als dem Select eingestellt. Das Problem liegt hier bei or (UrMaster.referenznr = 'ABT_25' ).

Auf allen Feldern in der Where liegt ein Index auch auf der RefernzNr.

Wenn ich das ganze ohne die letzte Zeile mache mache dauert es ca. 2 Sekunden. Mit dieser Bedingung dauert es ca. 22 Sekunden. Wenn ich das danze richtig deute (bei IBExpert) wird hier der Index nicht benutzt.

Ich muss die Joins so machen da ich daten aus den entsprechenden Tabellen benötige.

Kann mit jemand von Euch hier helfen ?

Danke schon einmal Tanja

Delphi-Quellcode:


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'
and (((MASTER.AltesSystem like 'Start%or MASTER.AltesSystem like 'Vorgang%' )
       and MASTER.AltesSystem not like '%Abbruch%and MASTER.Storno is null
     )
    or (UrMaster.referenznr = 'ABT_25' ) )
Tanja
  Mit Zitat antworten Zitat
jobo

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

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 08:40
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?
Gruß, Jo
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 12:30
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
Tanja
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
223 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 12:54
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
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: SQL dauert zu lange

  Alt 23. Jun 2016, 14:24
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
Tanja
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
223 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 15:42
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 08:47
Habe das Statement einmal strukturell verändert, um es für mich lesbarer zu machen.

Dabei hab' ich (nach meinem Verständnis) Vereinfachungen eingebaut und Verständnisprobleme mit Kommentaren versehen.

Allerdings habe ich keine Ahnung, ob das irgendwas am Geschwindigkeitsproblem ändert.
SQL-Code:
from MASTER
Left Outer JOIN SLAVE
on MASTER.Vorgangsnummer = SLAVE.Vorgangsnummer
and SLAVE.ZusatzStatus in ('EZ','EV','EF','EA','EQ','EP')
Left Outer Join MASTER UrMaster
on MASTER.Vorgangursprung = UrMaster.Vorgangsnummer
where MASTER.Status = 'In Bearbeitung'
and SLAVE.SlaveNummerr is not NULL
and MASTER.FATW = 'Aktive'
and
    (
     -- Beginn Verständnisproblem
     -- Hier verstehe ich nicht genau, was gemeint ist und weiß nicht, wie FireBird das handhabt.
     -- Das Is Null bezieht sich nur auf Status = 'In Arbeit'?
     ( SLAVE.SlaveStatus in ('Warten','Unterbrochen')
      or SLAVE.SlaveStatus = 'In Arbeitand SLAVE.Dzusatz is NULL
      -- Bei Is Null-Bezug nur auf 'In Arbeit' würd' ich das in Klammern setzen.
      or (SLAVE.SlaveStatus = 'In Arbeitand SLAVE.Dzusatz is NULL)
     )
     -- oder ist dieses gemeint?
     (
          SLAVE.SlaveStatus in ('Warten','Unterbrochen','In Arbeit')
      and SLAVE.Dzusatz is NULL
     )
     -- Ende Verständnisproblem
     
     or ( SLAVE.SlaveStatus = 'In Abreit'  <-- Schreibfehler? 'In Arbeit'
         and SLAVE.Dzusatz = 'Gesperrt'
         and SLAVE.Sollende < Current_Date
        )
    )
and
    (
     (
      (
          MASTER.AltesSystem like 'Start%'
       or MASTER.AltesSystem like 'Vorgang%'
      )
      and MASTER.AltesSystem not like '%Abbruch%'
      and MASTER.Storno is null
     )
     or (UrMaster.referenznr = 'ABT_25')
    )
Dann hätte ich noch ein fachliches Problem:
Worauf bezieht sich das UrMaster.referenznr = 'ABT_25' im zweiten Left outer Join.
Irgendwie kann ich an der Stelle, an der die Oder-Bedingung für die 'ABT_25' steht, nicht so recht den Sinn erkennen.

Es findet eine Grundsätzliche Verbindung über MASTER.Vorgangursprung = UrMaster.Vorgangsnummer statt.
Es gibt ein paar Einschränkungen und die letzte Einschränkung gilt für AltesSystem like 'Start%' oder like 'Vorgang%', sofern nicht AltesSystem like '%Abbruch% und Storno is null, wobei diese Einschränkung nicht für die 'Abt_25' gilt.
D. h.: Für 'Abt_25' sollen die Daten auch geliefert werden, wenn AltesSystem like 'Start%' oder like 'Vorgang%' ...?
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.675 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 09:01
wer lässt denn auch eine SQL-Abfrage versauern
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#9

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 09:20
wer lässt denn auch eine SQL-Abfrage versauern
das ganze ist unausgegoren
  Mit Zitat antworten Zitat
jobo

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

AW: SQL Sauert zu lange

  Alt 23. Jun 2016, 09:31
and SLAVE.ZusatzStatus in ('EZ','EV','EF','EA','EQ','EP')
Ich bin kein Firebird Spezialist, aber "in ()" oder "or" wird doch sehr wahrscheinlich intern gleich abgearbeitet? Wäre also nur besser für die Augen.

Ja und "sauer macht lustig", wollte ich schon immer mal loswerden.
Nicht dass wir die Sache am Ende mit zuviel unnötigem Ernst angehen.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz