![]() |
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:
In der Tabelle3 sind einige Datensätze welche als Farbe rot haben.
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' 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: |
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:
oder
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'
Delphi-Quellcode:
Sinnvolle Indexes für diese Abfrage wären aus meiner Sicht:
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' 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 |
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. |
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 23:25 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-2025 by Thomas Breitkreuz