![]() |
SQL Abfrage dauert ewig
Hey Leute
Habe folgende Procedure
Delphi-Quellcode:
Die funktioniert auch, jedoch habe lasse ich mir jetzt mit einem Query knapp 3,8 Millionen ID in die Destination Stringlist schreiben und das dauert natürlich ewig.
procedure DoQuery2(const sQuerySQL : string; DestList: TStrings);
begin DestList.BeginUpdate; try DestList.Clear; oTmpQry := TADOQuery.Create(nil); try try oTmpQry.Connection := Conn2; oTmpQry.CommandTimeout := 5000; oTmpQry.SQL.Text := sQuerySQL; oTmpQry.Open; while not oTmpQry.eof do begin DestList.add(oTmpQry.Fields[0].asString); oTmpQry.Next; end; except on e : exception do begin DestList.add(e.message); end; end; Finally oTmpQry.free; end; finally DestList.EndUpdate; end; end; Kann ich das ganze irgendwie schneller umsetzen? LG und Danke schon mal |
AW: SQL Abfrage dauert ewig
Definiere "Ewig"!
und bist du dir sicher das das schreiben in die Stringliste so lange dauert oder doch das abholen von 3,8 Mio. Datensätzen von der DB hast du auch richtige Curserlocation und fragst du auch nur die benötigt spalte ab? |
AW: SQL Abfrage dauert ewig
naja ewig heisst in meinem Fall ca 10 - 15 Minuten Minuten für 200.000 Datensätze.
Wenn ich es lokal über das Microsoft Management Studio durchführe is es wesentlich schneller. LG |
AW: SQL Abfrage dauert ewig
Zitat:
Als weitere Frage: Ist DestList nur eine einfache Stringlist oder kommt das z.b. von einer TListBox? Welche Einstellungen hat sie (evt. sortiert?) |
AW: SQL Abfrage dauert ewig
1. Ist die DestList vielleicht ein ListBox.Items oder ein Memo.Text? <-- Bernhard war schneller
2. Wer braucht denn 3.8 Mio Datensätze? 3. Tipp: Exportiere die Daten per SQL in eine Text-Datei und lies sie dann ein.
Code:
sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable" -o "MyData.txt"
|
AW: SQL Abfrage dauert ewig
Zitat:
@value is null 3.8 Mio Datensätze? und nur IDs wen interessiert das?? Gruß K-H OK es sind immer die gleichen Rückfragen, die hier gestellt werden. |
AW: SQL Abfrage dauert ewig
Zitat:
MS SQL Server: clUseClient MS Access: clUseServer |
AW: SQL Abfrage dauert ewig
versuch mal statt while not eof ... next, ist um Welten schneller
Delphi-Quellcode:
3.8 Mio - MS
while not Adodataset1.RecordSet.EOF do
begin sl.Add(Adodataset1.RecordSet.Fields[0].Value); Adodataset1.RecordSet.MoveNext; end; .eof ; Offen 15817 Fertig ?? abgebrochen nach 5 Minuten .Movenext Offen 15007 Fertig 29827 |
AW: SQL Abfrage dauert ewig
also das is geil!
Delphi-Quellcode:
da liegen ja welten dazwischen!
while not Adodataset1.RecordSet.EOF do
begin sl.Add(Adodataset1.RecordSet.Fields[0].Value); Adodataset1.RecordSet.MoveNext; end; |
AW: SQL Abfrage dauert ewig
freut mich dass es Dich freut ... :-D
|
AW: SQL Abfrage dauert ewig
cool DANKE ;)
Flutscht einwandfrei ;) |
AW: SQL Abfrage dauert ewig
Zitat:
|
AW: SQL Abfrage dauert ewig
Ich schließe mich dieser Frage an, da dies hier nur Fehler produzier:
Delphi-Quellcode:
---------------------------
procedure TForm1.btn1Click(Sender: TObject);
var liste:TStringList; sz1 :Integer; sz2 : Integer; sz3 : Integer; begin liste:=TStringList.Create; sz1:=0; sz2:=0; sz3:=0; adoquery1.Close; sz1:=gettickcount; adoquery1.open; sz2:=GetTickCount; Form1.Caption:=IntToStr(liste.Count)+' '+IntToStr(sz2-sz1)+' >>Open '+IntToStr(sz3-sz2)+' >>GetData'; Application.ProcessMessages; if not(adoquery1.Eof) then repeat liste.Add(adoquery1.Fields[0].asstring); adoquery1.Next; until adoquery1.eof; sz3:=GetTickCount; adoquery1.Close; Form1.Caption:=IntToStr(liste.Count)+' '+IntToStr(sz2-sz1)+' >>Open '+IntToStr(sz3-sz2)+' >>GetData'; liste.Free; end; procedure TForm1.btn2Click(Sender: TObject); var liste:TStringList; sz1 :Integer; sz2 : Integer; sz3 : Integer; begin liste:=TStringList.Create; sz1:=0; sz2:=0; sz3:=0; adoquery1.Close; sz1:=gettickcount; adoquery1.open; sz2:=GetTickCount; Form1.Caption:=IntToStr(liste.Count)+' '+IntToStr(sz2-sz1)+' >>Open '+IntToStr(sz3-sz2)+' >>GetData'; Application.ProcessMessages; if not(adoquery1.recordset.Eof) then repeat liste.Add(adoquery1.Recordset.Fields[0].value); adoquery1.Recordset.MoveNext; until adoquery1.eof; sz3:=GetTickCount; adoquery1.Close; Form1.Caption:=IntToStr(liste.Count)+' '+IntToStr(sz2-sz1)+' >>Open '+IntToStr(sz3-sz2)+' >>GetData'; liste.Free; end; Project1 --------------------------- Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record. --------------------------- OK --------------------------- Gruß K-H |
AW: SQL Abfrage dauert ewig
auch bei
Delphi-Quellcode:
While not adoquery1.RECORDSET.EOF
|
AW: SQL Abfrage dauert ewig
Zauberei:
Delphi-Quellcode:
warum wird
while not(adoquery1.recordset.Eof) do begin
liste.Add(adoquery1.Recordset.Fields[0].value); adoquery1.Recordset.MoveNext; end;
Delphi-Quellcode:
so verschmäht?
repeat ..until .eof
Gruß K-H P.S. Das fluppt wirklich!! |
AW: SQL Abfrage dauert ewig
Ist IMHO nicht intuitiv ....
Ich denke das Problem lag hier ... adoquery1.Eof statt adoquery1.recordset.Eof |
AW: SQL Abfrage dauert ewig
*schäm*
*schäm* Du hast Recht, bleibt die Frage warum. Zumindest die OH von 2006 warnt davor das RecordSet zu nutzen: Zitat:
K-H |
AW: SQL Abfrage dauert ewig
@Value is NULL:
Welche konkreter Typ hat bei dir eigentlich der Parameter
Delphi-Quellcode:
?
DestList: TStrings
Ich frage deshalb, weil es ein Riesenunterschied (Faktor 50) in Bezug auf die Performance ist ob man eine TStringList (schnell) oder TMemoStrings (langsam) verwendet. |
AW: SQL Abfrage dauert ewig
@p80286
nicht ganz umsonst, TAdoDataset packt einen Haufen Watte um die Recordsets, mit den Varianten bei NULL-Sätzen gilt es umzugehen ... die "Oberfläche" ab TADODataset kann sich desynchronisieren etc. Aber für Fälle wie in o.g. Anforderung sehe ich kaum Probleme ... |
AW: SQL Abfrage dauert ewig
Soweit ich mich erinnere, war 'Next' der Pferdefuß
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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 by Thomas Breitkreuz