Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Abfrage in Listview laden dauert lange (https://www.delphipraxis.net/40607-abfrage-listview-laden-dauert-lange.html)

schuetze09 18. Feb 2005 06:59


Abfrage in Listview laden dauert lange
 
Hallo zusammen,

ich machen eine Abfrage und lade die Daten in ein Listview. Leider dauert das ewig lange.
Wie kann ich das beschleunigen?

hier mein Code dazu:
Delphi-Quellcode:
procedure ShortV(Listview: TListView; Alle: Boolean);
var
  LI: TListItem;
  Query: TADOQuery;
begin
  Query:=TADOQuery.Create(nil);
  Query.Connection:=DataModule_DBConnect.ADOConnection1;
  with Query do
  begin
    Close;
    if Alle = True
    then SQL.Text:='Select distinct(tbl_w_daten.fk_w_id), tbl_w_id.username, tbl_umgebung.env'
                  +' from tbl_w_daten, tbl_umgebung, tbl_w_id where tbl_w_id.fk_env_id = tbl_umgebung.pk_env_id'
                  +' and tbl_w_id.pk_w_id = tbl_w_daten.fk_w_id order by tbl_w_daten.fk_w_id desc'
    else SQL.Text:='Select distinct(tbl_w_daten.fk_w_id), tbl_w_id.username, tbl_umgebung.env'
                  +' from tbl_w_daten, tbl_umgebung, tbl_w_id'
                  +' where tbl_w_id.fk_env_id = tbl_umgebung.pk_env_id and tbl_w_id.pk_w_id = tbl_w_daten.fk_w_id'
                  +' and tbl_w_id.edit_date > sysdate-10 order by tbl_w_daten.fk_w_id desc';
    Open;
    ListView.Items.BeginUpdate;
    Listview.Items.Clear;
    while not (EOF) do
    begin
      LI := Listview.Items.Add;
      LI.Caption := FormatFloat('000000', FieldByName('fk_w_id').AsInteger);
      LI.SubItems.Add(FieldByName('env').AsString);
      LI.SubItems.Add(FieldByName('username').AsString);
      Next;
    end;
    ListView.Items.EndUpdate;
    Close;
  end;
  Query.Free;
end;
MfG
schuetze09

Sharky 18. Feb 2005 07:20

Re: Abfrage in Listview laden dauert lange
 
Zitat:

Zitat von schuetze09
Hallo zusammen,

ich machen eine Abfrage und lade die Daten in ein Listview. Leider dauert das ewig lange.
Wie kann ich das beschleunigen?...

Hai schuetze09,
was verstehst Du denn uner "lange" und wieviele Datensätze sind es denn die geladen werden?

schuetze09 18. Feb 2005 07:24

Re: Abfrage in Listview laden dauert lange
 
@Sharky:
es werden derzeit ca. 1000 Datensätze geladen. Wenn ich die Daten nicht in das Listview einlesen lassen, sondern nur die while-schleife durchlaufe dauert es keine Sekunde, so aber um die 6sek.

Sharky 18. Feb 2005 07:31

Re: Abfrage in Listview laden dauert lange
 
Eventuell liegt es an dem FormatFloat? Jelly hatte in diesem Thread ein ähnliches Problem damit.

schuetze09 18. Feb 2005 07:48

Re: Abfrage in Listview laden dauert lange
 
also das es an dem FormatFloat liegt, weiß ich nicht! Ich habe es mal rausgelassen und die ID nicht formatiert. Das brachte dann eine Zeitersparnis von nicht einmal einer Sekunde...

Sharky 18. Feb 2005 08:06

Re: Abfrage in Listview laden dauert lange
 
Hmmm... ich habe mir eben mal 1000 mal den gleichen Text in eine Tabelle geschrieben (mySQL). Wenn ich mit diesen dann mein ListView fülle dauert das weniger als 1 sekunden bei einem Formatieren Zahlenfeld und zwei Strings.
Hast Du eventuell irgend eine Sortierfunktion für dein ListView?

schuetze09 18. Feb 2005 08:20

Re: Abfrage in Listview laden dauert lange
 
das einzige was ich noch mit dem Listview mache ist das:
Delphi-Quellcode:
procedure TForm_Main.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if (Item=nil) then Exit;
  if (Item.SubItems.Count>0) then
  begin
    if (Item.SubItems[1] = UserName) then Sender.Canvas.Brush.Color := clGray;
  end;
end;
könnte es daran liegen?

proitsystems 18. Feb 2005 09:59

Re: Abfrage in Listview laden dauert lange
 
Ich habe gerade eine "for" Schleife erstellt die ein Listview mit 999 Einträgen füllt. Und ich habe auch dein CustomDrawItem hingehängt (dementsprechend abgeändert).

Sofort nach dem Mausklick ist bei mir das Listview gefüllt.

Der Flaschenhals muss also irgendwo beim Abrufen deiner Daten sein. Also folgenden Performancetipp könnte ich dich noch geben:

1. Setze die Eigentschaft "LockType" vom ADOQuery auf "ltReadOnly". Das hat folgenden Sinn: du willst die Daten ja nicht verändern, so wird etwas Overhead gespart, da die ADOQuery sich nicht darauf vorbereiten muss Daten eventuell abzuändern.

2. Nachdem du die Query ausgeführt hast (nach Open), setze die Connection des ADOQuery auf "nil". Das hat folgenden Sinn: die Daten werden dann lokal im ADOQuery "gespeichert" (so eine Art FetchAll). Somit hast du alle Daten "bei dir".

Ich hoffe ich konnte dir mit den Tipps helfen!

Noch eine Frage interessehalber: Auf welcher Datenbank setzt deine Connection auf? (MS SQL?)

Gruss,

Marc
------
PRO IT SYSTEMS

Robert_G 18. Feb 2005 10:32

Re: Abfrage in Listview laden dauert lange
 
Zitat:

Zitat von proitsystems
Noch eine Frage interessehalber: Auf welcher Datenbank setzt deine Connection auf? (MS SQL?)

Er verwendet Oracle, und sollte deshlab auch auf keinem Fall den ADO Provider von MS nehmen!!!
Der ist eine lahme Schnecke und baut ziemlich lustigen krempel aus deinen Statements. (ADO und Ora ist sowieso eine lahme Kombi ;) )
Desweiteren solltest du vor dem Füllen BeginUpdate und danach EndUpdate für deinen LV ausführen.

schuetze09 18. Feb 2005 10:42

Re: Abfrage in Listview laden dauert lange
 
@Robert_G & proitsystems: ich habe auch Oracle.

mitlerweile habe ich mir auch gedacht, das es vielleicht eben am Listview liegt, also habe ich das ganze mal mit einem VirtualTreeview gemacht und das ist bedeutend schneller...

aber die Ideen von euch sind gut, werde ich bei meinen anderen Listviews einsetzen und ebenso beim VirtualTreeview.


@Robert_G:
Zitat:

ADO und Ora ist sowieso eine lahme Kombi
Was wäre den schneller? Ich hatte das mal mit einem Kumpel mit der DAO ausprobiert. Bei kleinen Datenmengen ist die bedeutend schneller, auch beim Connecten, aber wenn man dann in die 100.000er Datensätze geht, ist ADO schneller gewesen....


mfg
schuetze09


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