Hallo,
ich habe gerade ein ähnliches Problem und ein bisschen gegoogelt. Dabei kam heraus:
Der Tip, den Query so zu gestalten, dass jeweils nur ein Teil der Datensätze geholt wird, hilft nur bedingt. Er hilft dann, wenn alle Datensätze zusammen mehr sind, als in den Arbeitsspeicher passen. Allerdings frage ich mich dann, wie du deine Charts aufbaust, da sind ja auch alle Sachen drin (und vermutlich ist alles, was in der Chart ist, auch im Arbeitsspeicher). Dieser Ansatz hilft dir also nur, wenn du eine Chart mit "blättern" baust, so dass jeweils nur ein Blatt geladen wird. Dazu ist noch etwas zu bedenken:
SELECT*FROM table ORDER BY field_a LIMIT 1000 OFFSET 2000
wird dir zwar nur 1000 Datensätze liefern, nämlich die an den Postionen 2000 bis 2999 in Sortierung nach field_a, aber:
Der Server wird erst alle Datensätze von der Festplatte lesen, sortieren und dann die nicht benötigten wegschmeißen. Und das mehrmals, nämlich für jede Portion einmal. Das ist nicht unbedingt performant...(gilt nicht, wenn field_a ein Index ist, dann sind die Datensätze nämlich schon richtig sortiert). Gegebenenfalls muss der Server sogar eine Auslagerungsdatei auf der Festplatte nutzen (erstellen und wegschmeißen), weil deine x- tausend Datensätze eben nicht ins RAM passen (btw. embedded Database oder Server?). Ich kann hier gerade wunderschön beobachten, wie die Auslagerungsdatei erzeugt wird, wächst, gelöscht wird, neu erzeugt wird...
Allerdings ist meine Situation auch etwas anders. Ich muss aus den geholten Datensätzen neue Werte berechnen und diese in die Datenbank schreiben. Allerdings lese ich ja gerade aus dem Ding, was bedeutet, dass sie gelockt ist (SQLite). Folglich starte ich eine Transaktion, mache die Updates in der Transaktion und commite die jeweils zwischen den Paketen. Das Performanteste, was mir dabei gelungen ist, war bisher, die Paketgröße (das LIMIT im SQL- Query) so zu wählen, dass für die Update- Transaktion keine Auslagerungsdatei gebraucht wird. Die kurze Pause wann immer der Server alle Einträge liest nur um dann die, die nicht in LIMIT und OFFSET fallen, wegzuwerfen, merke ich trotzdem deutlich.