Model/View-Optimierung für große Tabellen
Verfasst: 8. April 2009 13:38
Hallo!
ich möchte eine Tabellenanwendung mittels Ableitungen der Klassen QTableView und QSqlQueryModel schreiben, die folgendes erfüllen soll:
* die Inhalt der SQLite-Tabelle kommt von einem Join mit 4 Tabellen und enthält viele (> 1000 bis ca. 100.000) Tabellenzeilen. Umgesetzt mit QTableView und QSqlQueryModel benötigt nur die Darstellung der Applikation bereits mehrere Minuten. Ich nehme an, dass das Modell _alle_ Daten aus der SQL-Abfrage lädt und in einer internen Datenstruktur abspeichert. Bei der Datenmenge ist das natürlich ineffizient.
* die Anwendung soll eine schnelle Sortier- und Filterfunktion besitzen.
* die Tabellenzellen sollen editierbar sein.
Es ist mir klar, dass ich ein eigenes Modell werde bauen müssen, da ja QSqlQueryModell nicht schreibbar ist.
Auch sollte die abgeleitete Klasse nur immer die Zeilen aus der DB laden, die vom View gerade gebraucht werden. Ich denke da daran, die Ergebnisse des Select-Statements mit LIMIT und OFFSET zu beschränken.
Wie man jedoch bei so vielen Zeilen effiziente Sortier- und Filtermechanismen einbaut, ist mir noch unklar. Vielleicht ist es der einfachste Weg, über das SQL-Statement zu sortieren (ORDER) und zu filtern (LIKE). Eine andere Möglichkeit wäre es mM, bereits abgefragte Daten im Modell zu cachen bzw. zu versuchen, bspw. über Suchbäume und ähnliche Datenstrukturen, SQL-Abfragen zu sparen oder zu umgehen.
Vielleicht könnt ihr kurze Hinweise geben, wie man dieses Problem konzeptionell am besten angeht. Ich weiß, dass meine Ausführungen sehr vage und oberflächlich sind, aber mehr kann ich dazu leider im Moment nicht schreiben, weil ich nicht weiß, wo ich den Hebel ansetzen soll.
ich möchte eine Tabellenanwendung mittels Ableitungen der Klassen QTableView und QSqlQueryModel schreiben, die folgendes erfüllen soll:
* die Inhalt der SQLite-Tabelle kommt von einem Join mit 4 Tabellen und enthält viele (> 1000 bis ca. 100.000) Tabellenzeilen. Umgesetzt mit QTableView und QSqlQueryModel benötigt nur die Darstellung der Applikation bereits mehrere Minuten. Ich nehme an, dass das Modell _alle_ Daten aus der SQL-Abfrage lädt und in einer internen Datenstruktur abspeichert. Bei der Datenmenge ist das natürlich ineffizient.
* die Anwendung soll eine schnelle Sortier- und Filterfunktion besitzen.
* die Tabellenzellen sollen editierbar sein.
Es ist mir klar, dass ich ein eigenes Modell werde bauen müssen, da ja QSqlQueryModell nicht schreibbar ist.
Auch sollte die abgeleitete Klasse nur immer die Zeilen aus der DB laden, die vom View gerade gebraucht werden. Ich denke da daran, die Ergebnisse des Select-Statements mit LIMIT und OFFSET zu beschränken.
Wie man jedoch bei so vielen Zeilen effiziente Sortier- und Filtermechanismen einbaut, ist mir noch unklar. Vielleicht ist es der einfachste Weg, über das SQL-Statement zu sortieren (ORDER) und zu filtern (LIKE). Eine andere Möglichkeit wäre es mM, bereits abgefragte Daten im Modell zu cachen bzw. zu versuchen, bspw. über Suchbäume und ähnliche Datenstrukturen, SQL-Abfragen zu sparen oder zu umgehen.
Vielleicht könnt ihr kurze Hinweise geben, wie man dieses Problem konzeptionell am besten angeht. Ich weiß, dass meine Ausführungen sehr vage und oberflächlich sind, aber mehr kann ich dazu leider im Moment nicht schreiben, weil ich nicht weiß, wo ich den Hebel ansetzen soll.