Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Optimieren (https://www.delphipraxis.net/112963-sql-optimieren.html)

Dumpfbacke 30. Apr 2008 09:59

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

SQL Optimieren
 
Hallo Liebe Leute,
ich habe hier ein Problem bei dem ich nicht weiter komme. Ich habe ein Abfrage welche auch funktioniert, jedoch zu lange dauert. Es dauert einige Minuten bis das Ergebnis kommt. Da ist nicht ein so großes Problem, jedoch würde ich es gerne schneller hinbekommen. Ich weiß einfach nicht wie ich die Abfrage optimieren kann.

Der Server ist ein Interbase. Ich vereinfache mal die Tabellen auf das nötigste. Die Daten müssen auch so in die Tabellen geschrieben werden. Die richtigen Indexe sind auch gesetzt.

Delphi-Quellcode:

Tabelle Wagen

Felder:
WagenZaehler Integer (mit Index)
Wagen       VarChar(20)

Tabelle Strecken

Felder:
StreckenZaehler Integer (mit Index)
Strecke VarChar(20)

Tabelle Verlauf

Felder:
VerlaufZaehler Integer (mit index)
IDWagen Integer (mit Index)
IDStrecke Integer (mit Index)
So das sind die Tabelle in vereinfachter Form. Das ganze besteht aus noch etlich Feldern und etlichen Tabellen

Hier mal einige Werte in den Tabellen

Delphi-Quellcode:
Tabelle Wagen:

WagenZaehler Wagen
1            Wagen grün
2            Wagen gelb
3            Wagen rot
4            Wagen blau

Tabelle Strecken

StreckZaehler Strecke
1             Strecke 1
2             Strecke 2 
3             Strecke 3
4             Strecke 4

Tabelle Verlauf

VerlaufZaehler IDWagen IDStrecke
1              1       1
2              2       1
3              3       4
4              1       2
5              4       2
6              1       3
7              1       4
8              4       1
9              4       3
Nun endlich zu meinem Problem. Ich möchte z.b. alle Wagen, die die (Strecke 1 oder 2) und (Strecke 3 oder 4) benutzen. Dazu habe ich mir diesen SQL Code überlegt.

SQL-Code:
 
Select Wagen
From Wagen
Where Wagenzaehler in
(Select IDWagen From Verlauf where IDStrecke in ('1','2'))
and WagenZaehler in
(Select IDWagen From Verlauf where IDStrecke in ('2','4'))
Als Ergebnis sollte hier Wagen 1 erscheinen
Wie gesagt es dauert einige Minuten. Kann man es optimieren ??

Danke Tanja

Codewalker 30. Apr 2008 10:04

Re: SQL Optimieren
 
Synchronisierte Selects mit in sind immer unschön. Besser ist es, direkt mit Joins zu arbeiten.
Außerdem (je nachdem wie groß deine Tabellen sind), kann man mit Indizes richtig viel erreichen. Ein passend zur Abfrage gesetzter Index kann (abhängig vom Verhältnis Rückgabemenge<->Tabellengröße) richtig viel Performance bringen.

mquadrat 30. Apr 2008 11:08

Re: SQL Optimieren
 
SQL-Code:
select distinct Wagen
from Wagen
inner join Verlauf vl1 on (Wagenzaehler = vl1.IDWagen) and (vl1.IDStrecke in (1,2))
inner join Verlauf vl2 on (Wagenzaehler = vl2.IDWagen) and (vl2.IDStrecke in (3,4))
Ohne das groß überprüft zu haben, sollte das schneller sein. Der erste Join schmeißt alle Wagen weg, die weder 1 noch 2 fahren. Der zweite Join eliminiert daraus dann alle die zwar 1 oder 2, aber weder 3 noch 4 fahren.
Das distinct dient dazu, dass jeder Wagen nur einmal in der Ergebnismenge vorkommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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