Hi DPler,
ich stehe gerade etwas auf dem Schlauch:
Hintergrundinfo:
Ich zeige über ein VST Felder einer Datenbank an. Nun habe ich mich per Profiler auf die Suche nach Performance Problemen gemacht, nachdem mir auffiel das ab ca. 1,5 bis 2,5 Mio Datensätzen das ganze alle paar Sekunden langsam wird. Langsam bedeutet hier: Aussetzer wenn man z.B. den Scrollbalken schnell bewegt - genau in der Zeit, wo das Tree seine Anzahl prüft und verändert.
Die Ursachen waren schnell ausgemacht: Im OnBeforeItemErase für die Colorierung statt Index den AbsoluteIndex verwendet (kniffliger Performance-Killer) und toAutoSort war true. Die dahinterliegende Datenbank erhält alle paar Sekunden neue Einträge, die auch angezeigt werden sollen. Bisher wird in einem Timer geprüft, ob die VST.RootNodeCount <>
DB.RecordCount ist und ggf. der RootNodeCount erhöht. Ein Trigger von Seiten der Datenbank (Push) ist leider nicht möglich, da die Einträge auch extern erfasst werden und es nur eine embedded
DB (SQLite3) genutzt wird.
Alles technisch kein Problem - und rasend schnell auch bei mehr als 2.5 Mio Einträge.
Frage:
Wie kann ich eine
DB-gerechte Sortierung umsetzen, die kein Performance-Killer ist?
Für die Sortierung wird nur das Feld bzw. die Spalte Index zugelassen, da hier auch der PK liegt und das OnCompare schnell geht. Wenn jetzt aber per RootNodeCount oder AddChild() neue Einträge dazukommen wird mit/ohne .BeginUpdate/.EndUpdate die ganze Tree neusortiert.
Wenn ich die Daten z.B. per
Delphi-Quellcode:
vstMainGrid.Sort(vstMainGrid.AddChild(vstMainGrid.RootNode),
vstMainGrid.Header.SortColumn, vstMainGrid.Header.SortDirection, True);
anfüge, werden diese trotzdem an der falschen Position eingefügt (z.B. großer Index > kleiner Index, neue große Index dann "dahinter").
Ich weiß, viele Lösungen verbieten bei dynamischen Trees und
DB-konnektierung von sich aus die Sortierung (devexpress u.a.). Trotzdem finde ich eine Basissortierung (1>n, n>1) schöner.
Ideen?
Gruß Assertor