Autor Beitrag
t.norge
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win XP
D5 Enterpr., D7 Prof., D8 Prof.
BeitragVerfasst: Fr 18.06.04 12:25 
Hallo Zusammen,

der t.norge hat einmal mehr eine Performance-Frage.

Ich habe mir für eine Abfrage folgendes überlegt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
...

 sql.text:='select count(koordinatenindex) from koordinatenpunkt '+
           'where koordinatenindex in '+
           '(select von from segment where straßenindex in (select straßenindex from straße where ortindex='+ortindex+')) '+
           'or koordinatenindex in '+
           '(select nach from segment where straßenindex in (select straßenindex from straße where ortindex='+ortindex+')) ';

 open;

...


Ich arbeite mit D7 und ADO, mein Problem ist nun, dass diese SQL-Abfrage mein System platt macht, bis zum Ende der Berechnung steht alles und das kann schon mal 10-30 Sek dauern. Die Anweisung application.Processmessages bringt hier leider auch nichts, da die Zeit direkt mit dem open verbunden ist...

Kann mir jemand helfen?
mstuebner
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 132

Win2000, XP
D7
BeitragVerfasst: Fr 18.06.04 12:32 
t.norge hat folgendes geschrieben:
Ich arbeite mit D7 und ADO, mein Problem ist nun, dass diese SQL-Abfrage mein System platt macht, bis zum Ende der Berechnung steht alles und das kann schon mal 10-30 Sek dauern. Die Anweisung application.Processmessages bringt hier leider auch nichts, da die Zeit direkt mit dem open verbunden ist...

Wenn Du diese Abfrage ausführts steht auch das Betriebssystem still (mag ich nicht glauben)? Ansonsten, wie wäre es damit die Abfrage in einem extra Thread zu starten?

_________________
mfg Matthias
t.norge Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win XP
D5 Enterpr., D7 Prof., D8 Prof.
BeitragVerfasst: Fr 18.06.04 12:34 
Nein,
entschuldige, habe mich unkorrekt ausgedrückt,
mein Betriebssystem steht nicht still, ich meinte damit mein Programm steht für die Zeit der Berechnung. @ mstueber

Torge
OlliWausD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: Fr 18.06.04 13:55 
hi,

ich nehme mal an, dass es sich hierbei um eine nicht gerade kleine DB handelt, da sonst die Abfrage innerhalb von ein paar sekunden ausgeführt wird.

Das dein Programm stillsteht ist nicht verwunderlich, denn

1. der IN-Befehlt braucht von Haus aus eine Wahnsinnszeit für die Ausführung
2. Je größer die Datenmenge des "IN (select ... from ...)" ist desto länger braucht die Anweisung. Je mehr Datensätze, desto mehr operationen. Hierbei handelt es sich aber nicht nur um eine Operation pro Datensatz, sondern es Steigt in etwa Expotentiell. (Bin mir da jetzt nicht sicher mit dem Expotentiell, aber es steigt Drastisch !) In deinem Fall wird ja quasi der IN-Befehl noch mal Gekoppelt. Also noch eine Steigerung oben drauf !!

Deswegen benutzt man bei Professioneller Programmierung den Befehl IN nur im Äußersten Notfall, da er einfach Zeit ohne Ende frist.

Deswegen würde ich sagen: Versuch einen anderen Lösungsweg, als diesen.

mfg

Olli W

_________________
Take it easy
blackbirdXXX

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Fr 18.06.04 15:52 
OlliWausD hat folgendes geschrieben:
hi,

ich nehme mal an, dass es sich hierbei um eine nicht gerade kleine DB handelt, da sonst die Abfrage innerhalb von ein paar sekunden ausgeführt wird.

Das dein Programm stillsteht ist nicht verwunderlich, denn

1. der IN-Befehlt braucht von Haus aus eine Wahnsinnszeit für die Ausführung
2. Je größer die Datenmenge des "IN (select ... from ...)" ist desto länger braucht die Anweisung. Je mehr Datensätze, desto mehr operationen. Hierbei handelt es sich aber nicht nur um eine Operation pro Datensatz, sondern es Steigt in etwa Expotentiell. (Bin mir da jetzt nicht sicher mit dem Expotentiell, aber es steigt Drastisch !) In deinem Fall wird ja quasi der IN-Befehl noch mal Gekoppelt. Also noch eine Steigerung oben drauf !!

Deswegen benutzt man bei Professioneller Programmierung den Befehl IN nur im Äußersten Notfall, da er einfach Zeit ohne Ende frist.

Deswegen würde ich sagen: Versuch einen anderen Lösungsweg, als diesen.

mfg

Olli W


Stimmt. Vielleicht kannst du alles auslesen und dann im Delphiprogramm die unbrauchbaren Einträge entfernen?
Bin mir aber nicht sicher, ob das schneller geht.

_________________
Klein, schwarz und ärgert Techniker? Jumper!
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: So 20.06.04 13:21 
Ich hab mir mal in 5min was überlegt, funktioniert aber sicher noch nicht ganz, aber Du könntest es mal als Inspiration nehmen:
ausblenden Quelltext
1:
2:
3:
4:
5:
SELECT count(*) 
FROM straße
INNER JOIN segment ON (straße.straßenindex=segment.straßenindex)
INNER JOIN koordinatenpunkt kp ON (kp.koordinatenindex=segment.von) OR (kp.koordinatenindex=segment.nach)
WHERE straße.ortindex=:ortindex


A propos: Welche Datenbank nimmst Du denn? Wenn es sich um Access handelt, kannste das oben so schonmal vergessen, dann musst Du die Joins verschachteln.
t.norge Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win XP
D5 Enterpr., D7 Prof., D8 Prof.
BeitragVerfasst: Mo 21.06.04 11:28 
Hallo Zusammen,

euch erstmal besten Dank für die Tipps! Ich werde mal schauen, wie ich sie umsetzten kann!

@UGrohne : Ich benutze Access :?

Besten Dank!

Torge