Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   SQL Abfrage dauert ewig (https://www.delphipraxis.net/170820-sql-abfrage-dauert-ewig.html)

value is NULL 4. Okt 2012 14:47

SQL Abfrage dauert ewig
 
Hey Leute

Habe folgende Procedure

Delphi-Quellcode:
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;
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.

Kann ich das ganze irgendwie schneller umsetzen?

LG und Danke schon mal

Bernhard Geyer 4. Okt 2012 14:50

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?

value is NULL 4. Okt 2012 15:01

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

Bernhard Geyer 4. Okt 2012 15:18

AW: SQL Abfrage dauert ewig
 
Zitat:

Zitat von value is NULL (Beitrag 1185684)
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.

Du hast 2 Fragen übersehen die ich noch gestellt habe.
Als weitere Frage: Ist DestList nur eine einfache Stringlist oder kommt das z.b. von einer TListBox? Welche Einstellungen hat sie (evt. sortiert?)

Furtbichler 4. Okt 2012 15:20

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"

p80286 4. Okt 2012 15:26

AW: SQL Abfrage dauert ewig
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1185680)
hast du auch richtige Curserlocation

Was wäre denn "richtig"?

@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.

Bernhard Geyer 4. Okt 2012 15:28

AW: SQL Abfrage dauert ewig
 
Zitat:

Zitat von p80286 (Beitrag 1185698)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1185680)
hast du auch richtige Curserlocation

Was wäre denn "richtig"?

Kommt auf die DB an.
MS SQL Server: clUseClient
MS Access: clUseServer

Bummi 4. Okt 2012 15:32

AW: SQL Abfrage dauert ewig
 
versuch mal statt while not eof ... next, ist um Welten schneller
Delphi-Quellcode:
   while not Adodataset1.RecordSet.EOF do
    begin
       sl.Add(Adodataset1.RecordSet.Fields[0].Value);
       Adodataset1.RecordSet.MoveNext;
    end;
3.8 Mio - MS
.eof ;
Offen 15817
Fertig ?? abgebrochen nach 5 Minuten

.Movenext
Offen 15007
Fertig 29827

value is NULL 4. Okt 2012 15:38

AW: SQL Abfrage dauert ewig
 
also das is geil!

Delphi-Quellcode:
   while not Adodataset1.RecordSet.EOF do
    begin
       sl.Add(Adodataset1.RecordSet.Fields[0].Value);
       Adodataset1.RecordSet.MoveNext;
    end;
da liegen ja welten dazwischen!

Bummi 4. Okt 2012 15:40

AW: SQL Abfrage dauert ewig
 
freut mich dass es Dich freut ... :-D

value is NULL 4. Okt 2012 15:47

AW: SQL Abfrage dauert ewig
 
cool DANKE ;)

Flutscht einwandfrei ;)

gmc616 4. Okt 2012 16:58

AW: SQL Abfrage dauert ewig
 
Zitat:

Zitat von Bummi (Beitrag 1185704)
versuch mal statt while not eof ... next, ist um Welten schneller
Delphi-Quellcode:
   while not Adodataset1.RecordSet.EOF do
    begin
       sl.Add(Adodataset1.RecordSet.Fields[0].Value);
       Adodataset1.RecordSet.MoveNext;
    end;

Kurze Zwischenfrage, wo ist der Unterschied? :gruebel:

p80286 4. Okt 2012 17:50

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

Bummi 4. Okt 2012 18:02

AW: SQL Abfrage dauert ewig
 
auch bei
Delphi-Quellcode:
 While not adoquery1.RECORDSET.EOF

p80286 4. Okt 2012 18:07

AW: SQL Abfrage dauert ewig
 
Zauberei:
Delphi-Quellcode:
 while not(adoquery1.recordset.Eof) do begin
    liste.Add(adoquery1.Recordset.Fields[0].value);
    adoquery1.Recordset.MoveNext;
  end;
warum wird
Delphi-Quellcode:
repeat ..until .eof
so verschmäht?

Gruß
K-H

P.S.
Das fluppt wirklich!!

Bummi 4. Okt 2012 18:10

AW: SQL Abfrage dauert ewig
 
Ist IMHO nicht intuitiv ....

Ich denke das Problem lag hier ...

adoquery1.Eof statt adoquery1.recordset.Eof

p80286 4. Okt 2012 18:34

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:

Hinweis:
Verwenden Sie diese Eigenschaft nur, wenn Sie mit ADO-Objekten und speziell mit ADO-Verbindungsobjekten vertraut sind. Die entsprechenden Informationen finden Sie in der Hilfe zum Microsoft SDK.
Gruß
K-H

shmia 4. Okt 2012 19:48

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.

Bummi 5. Okt 2012 00:25

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 ...

Furtbichler 5. Okt 2012 08:21

AW: SQL Abfrage dauert ewig
 
Soweit ich mich erinnere, war 'Next' der Pferdefuß


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 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