![]() |
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:
So das sind die Tabelle in vereinfachter Form. Das ganze besteht aus noch etlich Feldern und etlichen TabellenTabelle 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) Hier mal einige Werte in den Tabellen
Delphi-Quellcode:
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.
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
SQL-Code:
Als Ergebnis sollte hier Wagen 1 erscheinenSelect 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')) Wie gesagt es dauert einige Minuten. Kann man es optimieren ?? Danke Tanja |
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. |
Re: SQL Optimieren
SQL-Code:
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.
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)) Das distinct dient dazu, dass jeder Wagen nur einmal in der Ergebnismenge vorkommt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 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