Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit Left Outer Join (https://www.delphipraxis.net/123990-problem-mit-left-outer-join.html)

Dumpfbacke 12. Nov 2008 17:43

Datenbank: Interbase • Version: 6 • Zugriff über: IBX

Problem mit Left Outer Join
 
Hallo liebe Leute,
ich habe ein Problem mit einem Select auf einem Interbase - Server mit meinem Delphi Programm.

Hier der SQL (vereinfacht)

SQL-Code:
Select Tabelle1.*
From Tabelle1
Left Outer Join Tabelle2 on Tabelle1.ID1 = Tabelle2.ID2
Left Outer Join Tabelle3 on Tabelle2.ID4 = Tabelle3.ID3

Where Tabelle1.Bezeichnung = 'test'
and Tabelle3.Farbe = 'rot'
In der Tabelle3 sind einige Datensätze welche als Farbe rot haben.

Es ist ein Index auf ID1,ID2,ID3,ID4,Bezeichnung,Farbe. Nun haben sich die Datensätze der Tabelle1 (ca. 24.000) und Tabelle3 (ca 75.000) verdreifacht. Ich benutze die IBX Komponenten. Als Anzeige wird ein Grid benutzt und ein TIBDataSet um an die Daten zu kommen. Wenn ich es ohne den Join mache geht es recht zügig, jeodch mit dem Join dauert es um einiges länger als vorher auch dann wenn als Ergebnis eine kleine Anzahl von Datensätzen angezeit wird. Ich dachte die Anzahl der Datensätze ist egal, wenn das Ergebnis das selbe ist.

Um mir da ganze mal genauer anzusehen habe ich mir den SQL kopiert und der IBConsole ausgeführt. Dort geht es eigentlich sehr zügig. < 10 sec. je nach Werten. In meinem Programm dauert es ca 1 Minute bis ein Ergebnis kommt.

Hat jemand einen Tip für mich ? Ich habe den Left Outer Join schon mal durch ein in getauscht. Das war auch nicht besser.

Wieso ist die IBConsole schneller als mein Prohgramm ?

Danke Tanja
:gruebel:

automatix 17. Nov 2008 12:39

Re: Problem mit Left Outer Join
 
Hallo!

Eine Lösung habe ich nicht. Nur ein paar Vorschläge, wobei ich nicht beurteilen kann, ob die zutreffend sind (Abfrage oder Interbase). Mit Interbase habe ich noch nicht gearbeitet.

Sind das wirklich beides left outer join oder ist es vielleicht doch nur ein left outer join.
Dann wäre folgendes möglich:
Delphi-Quellcode:
select
   TABELLE1.*
from
   TABELLE1
   join TABELLE2
      on TABELLE2.ID2 = TABELLE1.ID1
   left outer join TABELLE3
      on TABELLE3.ID3 = TABELLE2.ID4
      and TABELLE3.FARBE = 'rot'
where
   TABELLE1.BEZEICHNUNG = 'test'
oder
Delphi-Quellcode:
select
   TABELLE1.*
from
   TABELLE1
   left outer join TABELLE2
      join TABELLE3
         on TABELLE3.ID3 = TABELLE2.ID4
         and TABELLE3.FARBE = 'rot'
      on TABELLE2.ID2 = TABELLE1.ID1
where
   TABELLE1.BEZEICHNUNG = 'test'
Sinnvolle Indexes für diese Abfrage wären aus meiner Sicht:
TABELLE1:
ID1, BEZEICHNUNG
TABELLE2:
ID2, ID4
TABELLE3:
ID3, FARBE

Seltsam ist allerdings, das es in der IBConsole wesentlich schneller geht. Machen die IBX-Komponenten auf Delphi Seite noch irgendetwas?. Ereigisse, berechnete Werte, etc?

Grüße

Der Jan 17. Nov 2008 16:41

Re: Problem mit Left Outer Join
 
Vermutung: Wenn du den TDataSet-Nachfolger von IBX verwendest (keine Ahnung wie der heißt), würde ich auf das Grid als Bremse tippen.
Schau mal, ob das DataSet Methoden wie DisableControls, DisableScrollEvents etc. hat. Verwende diese vor dem Aufruf des SQL und anschließend die entsprechenden Enable-Methoden.
Könnte evtl. helfen. Ist, wie gesagt, eine reine Vermutung.

automatix 18. Nov 2008 08:31

Re: Problem mit Left Outer Join
 
Hallo!

Stimmt, könnte auch aus der Ecke kommen. Da gibt es auch noch BeginUpdate / EndUpdate des Grids.

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.

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