Montag, Mai 09, 2011

ATOMIC_REFRESH

Meine aufrichtige Entschuldigung an T.S. Eliott, aber: DELETE ist das grausamste SQL-Element. Wenn es erfolgreich ist, benötigt es für größere Löschoperationen extrem viel Zeit - und wenn es nicht erfolgreich ist (ROLLBACK), noch viel mehr Zeit. Wo möglich, versuche ich es zu vermeiden - und lege lieber neue Tabellen an, die dann über Ringtausch ausgewechselt werden, oder lösche Inhalte via TRUNCATE.

Heute habe ich bei einer Complete Refresh-Operation für eine MView in 10.2 mit Schrecken festgestellt, dass die Löschung bestehender Inhalte über DELETE erfolgen sollte. Normalerweise hätte ich in einem solchen Fall eine PREBUILT TABLE verwendet, aber da es sich nicht um meinen Code handelte, habe ich mich stattdessen auf die Suche nach einem Mittel gegen das DELETE gemacht und bin - einmal mehr - bei Tom Kyte fündig geworden, der in einem (relativ aktuellen) Thread auf die Option ATOMIC_REFRESH hinweist, die das Refresh statt mit DELETE und INSERT mit TRUNCATE und INSERT /*+ APPEND */ durchführt. Natürlich gilt für diesen Fall: "Beware that of course the data will disappear during the refresh - as long as you are OK with that, it'll direct path."

Keine Kommentare:

Kommentar veröffentlichen