Romanticus
Grünschnabel
Hallo alle,
ich habe folgende Situation:
eine Tabelle der Produktiven DB mit 641000 Datensätzen (Tabellengröße - 2,9 GB). Auf dieser Tabelle ist ein View definiert, der nur bestimmte Spalten anzeigt. Die Daten dieses Views müssen in eine andere Tabelle in einer anderen Datenbank geschrieben werden. Dies erledigt ein kleines Java-Programm, das die Daten per JDBC ausliest und schreibt. Da ich nicht die gesamte Tabelle auf einmal auslesen kann (OutOfMemory-Exception), lese ich die Daten in Blöcken von 1000 Datensätzen aus und schreibe sie in die Ziel-Tabelle.
Rein technisch ist es ein prepared statement mit einer LIMIT-Beschränkung. Die Limit-Begrenzungen werden in einer Schleife immer um 1000 erhöht bis das Ende der Tabelle erreicht ist.
Dies funktioniert auch soweit, nur bricht die Performance mit der Zeit drastisch ein - die ersten 100000 Datensätze wurden in wenigen Sekunden kopiert, bei 400.000 Datensätzen dauerte das Auslesen eines 1000er-Blocks z.T. mehr als 120 Sekunden.
Das ist auch soweit einleuchtend, da das Statement keinerlei Bezug auf Indizes liefert und somit für jeden 1000er-Block ein Fullscan der Tabelle gemacht wird.
Meine Frage - gibt es eine Möglichkeit diesen Vorgang zu beschleunigen? Auf jeden Fall ist mir klar, dass LIMIT an dieser Stelle absolut unpassend ist.
Viele Grüße,
Romanticus
ich habe folgende Situation:
eine Tabelle der Produktiven DB mit 641000 Datensätzen (Tabellengröße - 2,9 GB). Auf dieser Tabelle ist ein View definiert, der nur bestimmte Spalten anzeigt. Die Daten dieses Views müssen in eine andere Tabelle in einer anderen Datenbank geschrieben werden. Dies erledigt ein kleines Java-Programm, das die Daten per JDBC ausliest und schreibt. Da ich nicht die gesamte Tabelle auf einmal auslesen kann (OutOfMemory-Exception), lese ich die Daten in Blöcken von 1000 Datensätzen aus und schreibe sie in die Ziel-Tabelle.
Rein technisch ist es ein prepared statement mit einer LIMIT-Beschränkung. Die Limit-Begrenzungen werden in einer Schleife immer um 1000 erhöht bis das Ende der Tabelle erreicht ist.
Dies funktioniert auch soweit, nur bricht die Performance mit der Zeit drastisch ein - die ersten 100000 Datensätze wurden in wenigen Sekunden kopiert, bei 400.000 Datensätzen dauerte das Auslesen eines 1000er-Blocks z.T. mehr als 120 Sekunden.
Das ist auch soweit einleuchtend, da das Statement keinerlei Bezug auf Indizes liefert und somit für jeden 1000er-Block ein Fullscan der Tabelle gemacht wird.
Meine Frage - gibt es eine Möglichkeit diesen Vorgang zu beschleunigen? Auf jeden Fall ist mir klar, dass LIMIT an dieser Stelle absolut unpassend ist.
Viele Grüße,
Romanticus