Hallo zusammen,
aktuell ist ein Kollege dabei, eine Datenmigration von einem Datenbankschema in ein anderes zu schreiben.
Betroffen davon ist ein Mengengerüst von 20 Millionen Tupeln.
Bei der Implementierung des Skriptes wurde darauf geachtet es möglich dynamisch zu halten. Bei der Ausführung des Skriptes wird PL/SQL benutzt. Die einzelnen UPDATE-Statements werden dabei pro Tupel durch Stringkontakenationen erstellt und anschließend per execute immediate ausgeführt.
Aktuell benötigt das Skript sage und schreibe 8 Tage zum laufen.
Basierend auf der langen Zeit muss das Skript umgebaut werden. Ich habe mir das Skrip mal angesehen und bin dabei auf folgende performancekritischen Gestoßen. Ich wollte Euch nun fragen, ob meine Einwände hier auch wirklich stimmen (nicht dass das Skript unnötigerweise falsch umgebaut wird):
1) Für jedes Tupel wird über zig Stringkonkatenationen eine Query zusammengebaut. Dieses zusammenbauen ist bei diesem Mengengerüst sicherlich nicht sonderlich performant.
2) Durch das Zusammenbauen der Query und dem execute immediate muss die Datenbank zur Laufzeit für jedes Tupel die Anfrage immer wieder parsen, kompilieren und den Ausführungsplan berechnen (stimmt diese Annahme?). Für 20 Millionen Tupel ist das ein erheblicher Aufwand.
Schon einmal Danke für Eure Hilfe!
Viele Grüße,
Martin
aktuell ist ein Kollege dabei, eine Datenmigration von einem Datenbankschema in ein anderes zu schreiben.
Betroffen davon ist ein Mengengerüst von 20 Millionen Tupeln.
Bei der Implementierung des Skriptes wurde darauf geachtet es möglich dynamisch zu halten. Bei der Ausführung des Skriptes wird PL/SQL benutzt. Die einzelnen UPDATE-Statements werden dabei pro Tupel durch Stringkontakenationen erstellt und anschließend per execute immediate ausgeführt.
Aktuell benötigt das Skript sage und schreibe 8 Tage zum laufen.
Basierend auf der langen Zeit muss das Skript umgebaut werden. Ich habe mir das Skrip mal angesehen und bin dabei auf folgende performancekritischen Gestoßen. Ich wollte Euch nun fragen, ob meine Einwände hier auch wirklich stimmen (nicht dass das Skript unnötigerweise falsch umgebaut wird):
1) Für jedes Tupel wird über zig Stringkonkatenationen eine Query zusammengebaut. Dieses zusammenbauen ist bei diesem Mengengerüst sicherlich nicht sonderlich performant.
2) Durch das Zusammenbauen der Query und dem execute immediate muss die Datenbank zur Laufzeit für jedes Tupel die Anfrage immer wieder parsen, kompilieren und den Ausführungsplan berechnen (stimmt diese Annahme?). Für 20 Millionen Tupel ist das ein erheblicher Aufwand.
Schon einmal Danke für Eure Hilfe!
Viele Grüße,
Martin
Comment