![]() |
Datenbank: Firebird • Version: 1.5.1 • Zugriff über: sql
Geschwindigkeit beim auslesen verbessern
hallo,
also folgendes problem... ich lese aus einer tabelle im moment 6500 datensaetze... jeder datensatz ist eine zeile mit ; getrennter daten, welche ich dann in ein topgrid schreibe... mein programm verwaltet projekte die alle solche daten enthalten koennen, wenn ich nun ein projekt mit 6500 daten anzeigen will, dauert es recht lang, wechsle ich aber zu einem projekt mit gar keinen oder wenig daten dauert es immer noch lang, verlangsamt sich der datenzugriff oder sonst was, je mehr daten in meiner db stehen, weshalb? habe ich wenig daten in meiner db, geht der wechsel zwischen den projekten schnell... hat wer ne idee? so lese ich aus und schreibe ins grid
Delphi-Quellcode:
// auslesen tabelle asset_data
c:=0; dataexist:=false; DM.ZQ.SQL.Clear; DM.ZQ.SQL.add('SELECT * FROM ASSET_DATA;'); DM.ZQ.Open; DM.ZQ.First; while not DM.ZQ.Eof do begin if caid = DM.ZQ.Fieldbyname('ASSET_ID').asinteger then begin dataexist:=true; break; end; dm.ZQ.Next; end; //while if dataexist then begin DM.ZQ.First; while not DM.ZQ.Eof do begin if caid = DM.ZQ.Fieldbyname('ASSET_ID').asinteger then begin c:=c+1; grd_asset.Rows:=grd_asset.Rows+1; s:= DM.ZQ.Fieldbyname('DATA').asString; templist:=Tstringlist.create; templist.Delimiter:=';'; templist.DelimitedText:=s; if c = 1 then grd_asset.Cols:=templist.Count; for i:=1 to templist.Count do grd_asset.Cell[i,c]:=templist.Strings[i-1]; end; DM.ZQ.Next; end; end; //if dataexist |
Re: Geschwindigkeit beim auslesen verbessern
du solltest deine abfrage optimieren, indem du nur datensätze holst die du brauchst, also asset_id=caid!
Delphi-Quellcode:
// auslesen tabelle asset_data
c:=0; dataexist:=false; DM.ZQ.SQL.Clear; DM.ZQ.SQL.add('SELECT * FROM ASSET_DATA'); DM.ZQ.SQL.add('where ASSET_ID='+inttostr(caid)); // vorselektieren! DM.ZQ.Open; if not DM.ZQ.Eof then DM.ZQ.First else exit; // keine daten vorhanden while not DM.ZQ.Eof do begin c:=c+1; grd_asset.Rows:=grd_asset.Rows+1; s:= DM.ZQ.Fieldbyname('DATA').asString; templist:=Tstringlist.create; templist.Delimiter:=';'; templist.DelimitedText:=s; if c = 1 then grd_asset.Cols:=templist.Count; for i:=1 to templist.Count do grd_asset.Cell[i,c]:=templist.Strings[i-1]; DM.ZQ.Next; end; end; //if dataexist |
Re: Geschwindigkeit beim auslesen verbessern
Hai Grumble,
da fallen mir zwei Sachen auf in deinem Code. 1) Wofür ist die erste Schleife? Du prüfst doch nur ob im Feld ASSET_ID ein bestimmter Wert vorkommt. Mache das doch gleich in deinem Query: 2) Du erzeugst für jede Zeile aus der Tabelle eine neue TStringList. Das haut dir doch den Speicher voll.
Delphi-Quellcode:
// auslesen tabelle asset_data
c:=0; dataexist:=false; DM.ZQ.SQL.Clear; DM.ZQ.SQL.add('SELECT * FROM ASSET_DATA WHERE ASSET_id = ' + IntToStr (caid)); DM.ZQ.Open; DM.ZQ.First; { while not DM.ZQ.Eof do begin if caid = DM.ZQ.Fieldbyname('ASSET_ID').asinteger then begin dataexist:=true; break; end; dm.ZQ.Next; end; //while if dataexist then begin DM.ZQ.First; } templist:=Tstringlist.create; try templist.Delimiter:=';'; while not DM.ZQ.Eof do begin // if caid = DM.ZQ.Fieldbyname('ASSET_ID').asinteger then // begin c:=c+1; grd_asset.Rows:=grd_asset.Rows+1; s:= DM.ZQ.Fieldbyname('DATA').asString; templist.DelimitedText:=s; if c = 1 then grd_asset.Cols:=templist.Count; for i:=1 to templist.Count do grd_asset.Cell[i,c]:=templist.Strings[i-1]; // end; DM.ZQ.Next; end; finally templist.Free; end; // end; //if dataexist |
Re: Geschwindigkeit beim auslesen verbessern
:wall: ja richtig ... die stringlist ..
weshalb bau ich hier if bedingungen ein wenn ueber query geht :wall: naja ich hab ja erst angefangen mit dem sql kram ... super danke euch fuer die tips |
Re: Geschwindigkeit beim auslesen verbessern
Kleiner Nachtrag:
Das müsste doch eigentlich so aussehen:
Delphi-Quellcode:
.
. for i:=1 to templist.Count -1 do // Der Index geht von 0 bis count -1 grd_asset.Cell[i,c]:=templist.Strings[i-1]; . . |
Re: Geschwindigkeit beim auslesen verbessern
deswegen aber
Delphi-Quellcode:
i-1
grd_asset.Cell[i,c]:=templist.Strings[i-1];
|
Re: Geschwindigkeit beim auslesen verbessern
Ups. Stimmt. Aber es ist verwirrend es so zu machen. Ich würde das immer in der Schleife angeben. Dann sieht jeder der den Code list wast Du machst.
|
Re: Geschwindigkeit beim auslesen verbessern
Übrigens ist es generell schlecht den Stern * zu nehmen.
auf ![]() Stattdessen sollte man die Felder holen, die man braucht. air |
Re: Geschwindigkeit beim auslesen verbessern
von daher hast du sicher recht, ich habs mir dummerweise andersrum angewoehnt...
koennte es evtl. auch noch sein dass das anfuegen einer reihe ans grid die sache verlangsamt? kann man die anzahl der datensaetze wo where asset_ID= caid ist so auch noch schnell rausbekommen, dann koennt ich die gridzeilenanzhal vorher festlegen, vielleicht bringt das auch noch mal geschwindigkeit... |
Re: Geschwindigkeit beim auslesen verbessern
Hallo Grumble,
versuchs mal mit
Delphi-Quellcode:
Greetz
DM.ZQ.RecordCount
alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 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-2025 by Thomas Breitkreuz