AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abfrage in Listview laden dauert lange

Ein Thema von schuetze09 · begonnen am 18. Feb 2005 · letzter Beitrag vom 18. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#1

Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 07:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 08:20
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?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#3

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 08:24
@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.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 08:31
Eventuell liegt es an dem FormatFloat? Jelly hatte in diesem Thread ein ähnliches Problem damit.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#5

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 08:48
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...
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 09:06
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?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#7

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 09:20
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?
  Mit Zitat antworten Zitat
proitsystems

Registriert seit: 4. Nov 2003
Ort: Augsburg
29 Beiträge
 
#8

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 10:59
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
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#9

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 11:32
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.
  Mit Zitat antworten Zitat
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#10

Re: Abfrage in Listview laden dauert lange

  Alt 18. Feb 2005, 11:42
@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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.
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