Hallo zusammen,
plane gerade eine Applikation und die Entscheidung muß zwischen PHP/MySQL auf Webserver oder Windows-Applikation fallen.
Es geht um eine Tabelle mit größenordnungsmäßig 1 Mio. Einträgen in einer Datenbank.
Hat jemand Erfahrungen mit einem QTableView, an dem ein QSqlQueryModel mit so vielen Einträgen hängt. Was sagt die Performance? Ist das dann noch benutzbar? Ich möchte sowie implementieren wie
- "Doppelklick auf einer Zeile" => Editierfenster geht auf für diesen Eintrag.
- STRG+Ende springt zum letzten Datensatz
- STRG+Pos1 zum ersten Datensatz
Meine erste Erfahrung war ehrlich gesagt schon negativ: 500 Test-Einträge.
Drücken von STRG+Ende springt ca. auf Datensatz 300 statt 500. Grund offensichtlich: Es wird im Hintergrund langsam successive alles ausgelesen. Wenn das noch nicht vollständig geschehen ist, geht der Tableview wohl von der aktuellen Anzahl der Zeilen als der endgültigen aus.
Als Workaround habe ich im Konstruktor einfach folgendes gemacht.
- Erst die Anzahl der Elemente ermitteln, dann auf Anzahl-1 springen, dann auf die 0. Damit zwinge ich den Tableview zum vollständigen Laden sofort.
Geht bei 500 Datensätze, aber bei einer Million kann ich mir das nicht mehr wirklich vorstellen in zumutbarer Geschwindigkeit.
Also: wie sieht es mit der Performance aus? Gibt es vielleicht ein grundsätzlich anderes Konzept, sowas zu implementieren?
Gruß aus Berlin, Gérôme
Performance für QTableView für 1 Mio. Datensätze
dein problem ist, schnell auf die elemente zu kommen ....
Nen View greift nur auf die Daten zu die es anzeigen will / muss.
nen tableview, ohne "sortierung" !!! braucht immer nur die sichtbaren zeilen ...
Ich wuerd folgendes versuchen:
- nen Vector mit den PK's über ne geeigneten abfrage bestuecken. die sollt weit weniger zeit kosten, als die kompletten daten ueberspuelen.
dazu zuerst die anzahl per sql statement ermitteln (count), und den Vector gleich richtig aufziehen, glaub das spart dir am ende zeit. Alternativ den vector ohne die anzahl groszuegig resizen ...
- vector mit den PK's befuellen .... 1 Million Datensaetze , angenommen, hoffentlich, dein PK passt in nen long, dann sind das 4 Mbyte ... noch vertretbar
- in der data methode, bekommst ueber den Modelindex und der Map den PK, und von da erst nen SQL statement absetzen, welcher dir die eigentlichen Inhalte holt. so holst immer nur die daten die auch grad anzeigst .....
- eventuell datensatze cachen, bzw was intelligentes ueberlegen, das ne bestimmte anzahl daten scho im vorraus holen kannst ... wenn er auf die letzte zeile springt, wird er wohl die 20 zeilen davor auch anzeigen, da kann man noch bissi optimieren ....
die PK's zu bekommen, wird vielleicht recht lange dauern, aber das brauchst als vorbereitung fuer den view, also wenns geht zeitlich wohin auslagern wo es ned so schlimm iss.
20 - 50 Datensaetze zu holen wenn die PKs hasst, sollt fuer keine DB nen Problem sein .... und sollt den user ned wirklich lange geduld ueben lassen.
Falls deine datenbank, oder deine verbindung wirklich gaehnend langsam ist ... wird dich eh nur nen temp file weiterbringen ...
Aber einmal alles abfragen, da wirst dann ned drumherum kommen.
Dort kannst dann datensaetze mit max. groesse ablegen und mit bissi arithmetik immer gleich an die richtigen stellen im file springen ...
Ciao ...
Nen View greift nur auf die Daten zu die es anzeigen will / muss.
nen tableview, ohne "sortierung" !!! braucht immer nur die sichtbaren zeilen ...
Ich wuerd folgendes versuchen:
- nen Vector mit den PK's über ne geeigneten abfrage bestuecken. die sollt weit weniger zeit kosten, als die kompletten daten ueberspuelen.
dazu zuerst die anzahl per sql statement ermitteln (count), und den Vector gleich richtig aufziehen, glaub das spart dir am ende zeit. Alternativ den vector ohne die anzahl groszuegig resizen ...
- vector mit den PK's befuellen .... 1 Million Datensaetze , angenommen, hoffentlich, dein PK passt in nen long, dann sind das 4 Mbyte ... noch vertretbar
- in der data methode, bekommst ueber den Modelindex und der Map den PK, und von da erst nen SQL statement absetzen, welcher dir die eigentlichen Inhalte holt. so holst immer nur die daten die auch grad anzeigst .....
- eventuell datensatze cachen, bzw was intelligentes ueberlegen, das ne bestimmte anzahl daten scho im vorraus holen kannst ... wenn er auf die letzte zeile springt, wird er wohl die 20 zeilen davor auch anzeigen, da kann man noch bissi optimieren ....
die PK's zu bekommen, wird vielleicht recht lange dauern, aber das brauchst als vorbereitung fuer den view, also wenns geht zeitlich wohin auslagern wo es ned so schlimm iss.
20 - 50 Datensaetze zu holen wenn die PKs hasst, sollt fuer keine DB nen Problem sein .... und sollt den user ned wirklich lange geduld ueben lassen.
Falls deine datenbank, oder deine verbindung wirklich gaehnend langsam ist ... wird dich eh nur nen temp file weiterbringen ...
Aber einmal alles abfragen, da wirst dann ned drumherum kommen.
Dort kannst dann datensaetze mit max. groesse ablegen und mit bissi arithmetik immer gleich an die richtigen stellen im file springen ...
Ciao ...
Danke für die Konzept-Idee, muß ich mal mit rumprobieren.RHBaum hat geschrieben:dein problem ist, schnell auf die elemente zu kommen ....
Nen View greift nur auf die Daten zu die es anzeigen will / muss.
nen tableview, ohne "sortierung" !!! braucht immer nur die sichtbaren zeilen ...
[snip]
Gruß, Gérôme