Und wieder verweise ich auf Jonathan Lewis, der diesmal eine interessante neue (12c) Refresh-Option für Materialized Views vorstellt, die durch den Parameter out_of_place aufgerufen wird. Die Idee dabei ist sehr einfach: im Rahmen des Refreshs wird eine zusätzliche Hilfstabelle erzeugt und gefüllt, die dann am Ende der Operation gegen das bisher zur MV gehörende Segment ausgetauscht wird (über eine interne Folge von Rename-Operationen). Das Verfahren entspricht grundsätzlich einem Workaround, den der Herr Lewis in einem älteren Artikel vorgestellt hatte, in dem er die MV als Partitionierte Tabelle mit einer einzigen Partition anlegte und den Refresh als Partition Exchange Operation ausführte. Mir gefällt dieser Workaround tatsächlich immer noch besser als die neue out-of-place Refresh-Variante, was vor allem an folgenden Einschränkungen der Option liegt:
- die Insert-Operation wird als konventionelle durchgeführt, also ohne Append-Hint.
- es ist nicht möglich die Option einzusetzen, um eine MV zu aktualisieren, die als Subset einer einzelnen Basistabelle definiert ist (also Spalten oder Zeilen ausschließt).
Für beide Beschränkungen fehlt mir zunächst eine einleuchtende Erklärung - aber vielleicht gibt es auch keine und die Einschränkungen werden in folgenden Releases aufgehoben.