AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

SQL Optimieren

Ein Thema von Dumpfbacke · begonnen am 30. Apr 2008 · letzter Beitrag vom 30. Apr 2008
Antwort Antwort
Dumpfbacke

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

SQL Optimieren

  Alt 30. Apr 2008, 10:59
Datenbank: Interbase • Version: 6 • Zugriff über: IBX
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
Tanja
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#2

Re: SQL Optimieren

  Alt 30. Apr 2008, 11:04
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.
Thomas
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#3

Re: SQL Optimieren

  Alt 30. Apr 2008, 12:08
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:00 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