![]() |
Datenbank: MS Access • Version: 2003 • Zugriff über: ADO
DevExpress speed Probleme bei >=5000 Datensätze
Hallo Leute
habe riesige Probleme mit dem cxGrid was Geschwindigkeit an belangt. habe ein kleines anschauungs- Beispiel angehängt. Ist aber leider 1,6MB groß wegen der Demo Daten. :pale: kann mir jemand einen Tipp geben wie ich die Geschwindigkeit beim laden der Daten massiv verbessern kann. Für einen Tipp währe ich sehr Dankbar. :thumb: schöne Grüsse Tau |
Re: DevExpress speed Probleme bei >=5000 Datensätze
Zitat:
|
Re: DevExpress speed Probleme bei >=5000 Datensätze
Liste der Anhänge anzeigen (Anzahl: 1)
ups habe das Demo noch etwas umgebaut ( 16 KB )
Die Demo Daten kann man jetzt selbst anlegen. Sorry :-D schöne Grüsse Tau |
Re: DevExpress speed Probleme bei >=5000 Datensätze
Du verwendest das cxGrid nicht im Gridmode.
Das bedeutet, das sich das cxGrid im Modus "LoadAllRecords" befindet, was wiederum bedeutet, das wirklich alle Datensätze aus der Datenquelle geladen, sortiert, in die MRU's und Dropdowns eingetragen und ggf. gefiltert werden. Das dauert schon seine Zeit. Wenn du das Grid mal testweise im Gridmode verwendest, wirst du feststellen, das es genauso schnell ist wie das DBGrid. Da viele nette Features des cxGrids im Gridmode unbenutzbar sind, hier ein kleiner Tip zur Optimierung. Ich habe einfach mal deine Action "procedure TFmHaupt.Action2Execute(Sender: TObject);" umgebaut.
Delphi-Quellcode:
Ich habe mir 170000 Testdatensätze erzeugt.
procedure TFmHaupt.Action2Execute(Sender: TObject);
var BeginTime: TDateTime; Zeit: Integer; begin // Startzeit für Zeitmessung merken BeginTime := Now; // cxGrid Datacontroller in den Updatemode versetzen cxGrid1DBTableView1.DataController.BeginFullUpdate; // cxGrid Datacontroller SmartRefresh aktivieren cxGrid1DBTableView1.DataController.DataModeController.SmartRefresh:=true; // Nur zum Test... der GridMode // Kommentar entfernen um den Gridmode zu aktivieren // << den da :o) << cxGrid1DBTableView1.DataController.DataModeController.GridMode:=true; // Den Cursor der TAdoQuery auf ctOpenForwardOnly setzen // Das ermöglicht einen schnelleren sequentiellen Durchlauf DMHaupt.Q02.CursorType:=ctOpenForwardOnly; // Datenquelle (Query02) von der Datasource abhängen // Q02.disablecontrols wäre auch OK dsq2.DataSet:=nil; // Query öffnen DMHaupt.Q02.Open; // Datenquelle (Query02) wieder an die Datasource hängen dsq2.DataSet:=dmhaupt.Q02; // Den Cursor der TAdoQuery auf ctStatic zurücksetzen DMHaupt.Q02.CursorType:=ctStatic; // cxGrid Datacontroller aus dem Updatemode nehmen cxGrid1DBTableView1.DataController.EndFullUpdate; // Endzeit setzen und Dauer anzeigen Zeit := round((now - BeginTime) * 86400000); Label2.Caption := FormatFloat('#,###.##', Zeit) +' ms' +#10#13 +FormatFloat('#,##0.###', (Zeit / 1000)) +' s'; end; Mit dem Original-Code hat das Laden bei mit gut 19 Sekunden gedauert (im Gridmide ca. 650 ms). So braucht das Grid noch 8-9 Sekunden (wovon bei mir allein das Öffnen der Query eine knappe Sekunde dauert). Ich hoffe es hilft etwas. Schöne Grüße, Jens :hi: [edit] Falls deine Anwendung es erlaubt, könntest du ggf. auch darüber nachdenken, nur Teil-Datenmengen aus der DB abzufragen. Meiner Meinung nach ist es nicht in jedem Fall sinnvoll, dem Anwender 170.000 Datensätze auf einmal vorzuwerfen. [/edit] |
Re: DevExpress speed Probleme bei >=5000 Datensätze
Hallo Jens
Danke für die Tipps mit dem BeginFullUpdate und Gridmode. :thumb: Das sind schon Massive unterschiede in der Zeit. Habe einige Tests durchgeführt mit erstaunlichen Ergebnissen. Hat es einen Bestimmten Grund warum du lieber das Zitat:
Zitat:
Du hast Recht wenn du meinst das der User nicht alle Daten auf einmal braucht. Nur habe ich bis heute noch keinen Lösungsansatz für das Problem gefunden. Bei mir ist das cxGrid fast zu 90% nur für die Darstellung der Daten zuständig ohne irgendwelche Features wie ( ComboBox, DateEdit usw. ). Bin mir gerade am überlegen wie ich die Sortierung über SQL Lösen könnte :gruebel: ( ORDER BY Feld ASC oder DESC ) hättest du vielleicht einige Tipps? oder gibt es noch andere Möglichkeiten um das Grid ein bisschen schneller zu machen. nochmals Danke für die Tipps schöne Grüsse Tau |
Re: DevExpress speed Probleme bei >=5000 Datensätze
Zitat:
DSQ2.DataSet := nil ist imho etwas schneller weil die Datasource komplett von der Datenquelle getrennt wird. Besonders wenn man viele datensensitive Controls verwendet. Zitat:
baue den SQL Code der Query Q02 doch einfach Dynamisch zusammen. Am Besten auf einer Function. vereinfachtes Beispiel:
Delphi-Quellcode:
Jetzt kannst du z.B. im onHeaderClick, über Comboboxen o.Ä. die Sortierung per SQL ändern.
function TForm1.LoadData(SortParam:TSortParam; SortedFieldName, WHERE :String):Boolean;
var SQL,SortFlag:String; begin // SortParam z.B. als SET (sfUnsorted, sfAscending, sfDescending) result :=false; SortFlag :=''; SQL:=''; if (SortParam = sfAscending) AND (SortedFieldname<>'') then SortFlag:='ORDER BY '+SortedFieldName; if (SortParam = sfDescending) AND (SortedFieldname<>'') then SortFlag:='ORDER BY '+SortedFieldName+' DESC'; SQL := 'SELECT * FROM TABLE1 '+WHERE+' '+SortParam; Query.close; Query.sql.clear; Query.sql.text:=SQL; try Query.open; Result:=Query.active; except on e:Exception do begin Showmessage(e.message); result:=false; end; end; end; z.B.
Delphi-Quellcode:
if LoadData(sfDescending,'ID', 'WHERE Name = ''Müller'' ') then
ShowMessage('Fertig') else ShowMessage('Das hat leider nicht geklappt.'); |
Re: DevExpress speed Probleme bei >=5000 Datensätze
Hallo Jens
Danke für die ausführliche Erklärungen. :thumb: der Lösungsansatz ist ausbaufähig und hat mich auf ein bar Ideen gebracht. :coder2: Die werde ich aber erst im Laufe des Tages umsetzen. jetzt ist es zeit zum schlafen zu gehen DA N K E. :hi: schöne Grüsse Tau |
Re: DevExpress speed Probleme bei >=5000 Datensätze
Hallo Jens
die Sortierung funktioniert Einwand frei. :thumb: habe es auf meine Bedürfnisse zugeschnitten da ich nur den SQL String brauche. Falls Interesse besteht poste ich gerne die Lösung. Zitat:
Deshalb habe ich versucht ein bar Anregungen zu finden leider ohne erfolg. :wall: Hättest du vielleicht eine bar Anregungen wie so ein Lösungsansatz aussehen könnte. schöne Grüsse Tau |
Re: DevExpress speed Probleme bei >=5000 Datensätze
1. Vermeide das
SQL-Code:
Schreibe die Felder statt des * da rein. Das bewirkt alleine schon kleinere Wunder.
Select * from blubb
2. das WHERE in einem Select wirkt ähnlich ! 3. schmeiße Access weg. :mrgreen: |
Re: DevExpress speed Probleme bei >=5000 Datensätze
Hallo Hansa
Danke für die Tipps :thumb: Zitat:
um schnell etwas ausprobieren zu können. schöne Grüsse Tau |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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