Auf diese Art erfuhren Johannes Ahrends und ich bei der diesjährigen DOAG 2024 Datenbank mit Exaday in Düsseldorf von Bruno Cirone von einem netten Feature des ALTER-TABLE-MOVE-Kommandos.
Reorganisation von Tabellen
Im Grunde ist ein ALTER TABLE MOVE quasi ein alter Hut. Soll eine Tabelle reorganisiert werden, um den nicht benutzten, aber allokierten Platz freizugeben, dann kann die Tabelle mit diesem Kommando quasi neu aufgebaut werden. Dabei werden alle Daten in ein neues Segment kopiert, so dass der Platz im Segment wieder voll genutzt und dementsprechend auch nur der wirkliche nötige Storage allokiert wird. Dabei werden natürlich alle Indexe invalid, da sich die ROWIDs der Zeilen alle ändern. Dafür gibt es den UPDATE INDEXES clause, der nach der Reorganisation auch gleich alle Indexe wieder neu aufbaut. Und wenn man glücklicher Besitzer einer Enterprise-Edition-Lizenz ist, kann man das Ganze auch mit ONLINE ohne ein exklusives Lock auf die Tabelle durchführen, so dass Anwendungen weiterhin DMLs gegen die zu reorganisierende Tabelle ausführen können.
Warum aber entsteht überhaupt ungenutzter Platz in einem Tabellensegment?
Das passiert häufig, wenn in der ersten Version einer Anwendung erst einmal die Funktionalitäten zum Erzeugen von Daten implementiert werden. Erst in Version 5 der Anwendung, nach vielleicht 10 Jahren Betrieb, kommt dann das Feature zum Löschen alter Daten, die nicht mehr benötigt werden. Dann geht man einher und löscht einen Großteil der Daten aus Tabellen, dieser Platz bleibt dann entsprechend für die Tabelle reserviert, ist aber ungenutzt. Diesen Platz will man natürlich wieder freigeben und ein Mittel dazu ist ein ALTER TABLE MOVE.
Nun ist aber das Löschen eines Großteils der Daten aus einer Tabelle recht aufwändig. Einfacher ist es, einfach die verbleibenden Daten herauszukopieren und die alte, große Tabelle zu löschen. Allerdings müssen hier Grants, Constraints usw. beachtet werden. Und genau hier kommt der Tipp von Bruno ins Spiel. Denn das ALTER TABLE MOVE beinhaltet eine Filter Condition, die eine WHERE-Klausel verwendet, um die zu übertragenden Daten zu filtern. Man führt also das Purging der Altdaten und die Reorganisation in einem Schritt durch. Ergänzt durch die Online-Clause UPDATE INDEXES werden auch die Indexe der Tabelle gleich mit auf den neuen Stand gebracht und der Online-Clause (Enterprise Edition) führt das Ganze ohne exklusives Lock auf die Tabelle durch, so dass DML-Operationen weiterhin möglich sind. Natürlich gibt es einige Dinge zu beachten, denn man sollte eben während so einer Operation keine Daten einfügen, die dem Filter nicht entsprechen.
Die Details dazu finden sich in der Dokumentation.
Alles in allem eine nette Möglichkeit, Daten zu purgen und gleichzeitig den Platz wieder freizugeben. Diese Filter Condidition gibt es im Übrigen auch für Partition-Operationen.
Vielen Dank an dieser Stelle noch mal an Bruno für diesen schönen Tipp.
Marco Pachaly-Mischke


