Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADOQUERY mit Unterabfrage (https://www.delphipraxis.net/183013-adoquery-mit-unterabfrage.html)

simonk2309 4. Dez 2014 10:06

Datenbank: MSSQL • Version: 8 • Zugriff über: ADO

ADOQUERY mit Unterabfrage
 
Hallo habe ein Problem mit einer Abfrage über ADOQUERY

SELECT * FROM DOKPos WHERE (POS_NR IN
(SELECT POS_NR FROM Rueckstand_Auftraege
WHERE (offeneAUFSTK > 0) AND (Nummernkreis =: P_nummernkreis)))
ORDER BY Zeile

die Abfrage dauert extrem lange (mehrere Minuten) und läuft immer in ein Timeout.
rufe ich die Abfrage in MSSQL Studio auf dauert das nicht mal eine Sekunde.

hat jemand einen Tipp wie ich das in Delphi 7 besser lösen könnte.
danke

mkinzler 4. Dez 2014 10:30

AW: ADOQUERY mit Unterabfrage
 
Schon mal mit einem Join versucht?

EarlyBird 4. Dez 2014 10:49

AW: ADOQUERY mit Unterabfrage
 
oder eine gespeicherte Prozedur mit Parameter

Dejan Vu 4. Dez 2014 11:05

AW: ADOQUERY mit Unterabfrage
 
Das löst doch nicht das Problem, das die Query im Studio in einer Sekunde läuft und auf dem Client ne Minute oder länger braucht. Der Server optimiert das eh so, da der Plan der gleiche ist.

Ich glaube, deine Namensauflösung hat ne Macke. Versuch mal, dich mit dem Server über die IP zu verbinden.

simonk2309 4. Dez 2014 12:13

AW: ADOQUERY mit Unterabfrage
 
Zitat:

Zitat von mkinzler (Beitrag 1282210)
Schon mal mit einem Join versucht?

ja das hab ich mir auch gedacht und dann mal probiert:

SELECT DOKPos.*,Rueckstand_Auftraege.*
FROM DOKPos RIGHT OUTER JOIN
Rueckstand_Auftraege ON DOKPos.POS_NR = Rueckstand_Auftraege.POS_NR
WHERE (Rueckstand_Auftraege.offeneAUFSTK > 0) AND (Rueckstand_Auftraege.Nummernkreis =: P_nummernkreis)
order by Rueckstand_Auftraege.Zeile

Ergebnis: funktioniert ! Warum ?? verstehe ich nicht?
gibt's da eine Idee von jemanden?

simonk2309 4. Dez 2014 12:15

AW: ADOQUERY mit Unterabfrage
 
Zitat:

Zitat von Dejan Vu (Beitrag 1282216)
Das löst doch nicht das Problem, das die Query im Studio in einer Sekunde läuft und auf dem Client ne Minute oder länger braucht. Der Server optimiert das eh so, da der Plan der gleiche ist.

Ich glaube, deine Namensauflösung hat ne Macke. Versuch mal, dich mit dem Server über die IP zu verbinden.

Nein, connection zum server ist OK; hab auch noch andere ADOQUERYs am laufen; auch wenn ich ein einfaches SQL statement verwende funktioniert es

Bernhard Geyer 4. Dez 2014 12:23

AW: ADOQUERY mit Unterabfrage
 
Ist im Management-Studio auch das komplette Abfrageergebnis das oder nur die ersten Ergebnisse?

mkinzler 4. Dez 2014 12:31

AW: ADOQUERY mit Unterabfrage
 
Deine ursprüngliche Abfrage war aber ein inner Join. U.U. kommt jetzt eine größere Ergebnismenge heraus.

p80286 4. Dez 2014 12:40

AW: ADOQUERY mit Unterabfrage
 
Zitat:

Zitat von simonk2309 (Beitrag 1282223)
Ergebnis: funktioniert ! Warum ?? verstehe ich nicht?
gibt's da eine Idee von jemanden?

Na das "in" ist ja nicht die schnellste Methode um Daten einzugrenzen, da wunderte mich Dein Zeitproblem überhaupt nicht.

Gruß
K-H

Dejan Vu 4. Dez 2014 13:35

AW: ADOQUERY mit Unterabfrage
 
Zitat:

Zitat von p80286 (Beitrag 1282233)
Na das "in" ist ja nicht die schnellste Methode um Daten einzugrenzen, da wunderte mich Dein Zeitproblem überhaupt nicht.

So pauschal kann man das nicht sagen: SQL-Server verwendet den gleichen Queryplan wie bei einem Join

Da fällt mir noch etwas ein:
Im SSMS siehst Du die ersten Zeilen manchmal sofort, aber es kann sein, das die Query trotzdem ewig braucht, bis sie *fertig* ist. In Delphi wartest Du, bis alle Daten da sind.

Prüfe also im SSMS, wie lange es dauert, bis die Query fertig ist. Ich würde einen Index auf die Pos-Nr setzen und das Order-by erst einmal weglassen. Sortieren kannst Du auch im Client.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.
Seite 1 von 2  1 2      

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