Neue Funktionalität in 10g: ALTER TABLE SHRINK
Wer kennt nicht dieses Problem: Es gibt in der Datenbank eine große Tabelle, aus der viele Datensätze gelöscht wurden. Die Datensätze sind zwar gelöscht, aber der physikalische Platz in dem Tablespace wird nicht freigegeben, und die "HIGH WATER MARK" wird nicht verändert.
Die Möglichkeiten, die "HIGH WATER MARK" zurückzusetzen, die es bislang gab, sind: ALTER TABLE MOVE TABLESPACE bzw. EXPORT / IMPORT. Bei diesen Optionen ist jedoch eine Ausfallzeit gegeben.
In der Version 10g ist es jetzt machbar, die "HIGH WATER MARK" zurückzusetzen, ohne die Tabelle zu sperren: Und zwar mit Hilfe von SHRINK_CLAUSE des Befehls ALTER TABLE. Mit der SHRINK_CLAUSE können Tabellen, Indizes, indexorganisierte Tabellen, Partitionen, Subpartitionen, LOB Segmente (ab Version 10.2) und Materialized Views manuell verkleinert werden.
Voraussetzungen:
Einschränkungen:
Beispiel:
In diesem Beispiel verwende ich eine Tabelle BIGEMP mit ca. 7,5 Mio. Datensätzen.
Als erstes wird überprüft, wie viele Blöcke und Extents von der Tabelle allokiert sind.
Select BLOCKS, EXTENTS from USER_SEGMENTS where SEGMENT_NAME = 'BIGEMP';
BLOCKS EXTENTS
------ ----------
45696 116
Als weitere Ausgangswerte dienen die leeren Blöcke und der durchschnittliche freie Platz innerhalb eines Blockes. Diese Werte werden bei einem ANALYZE TABLE-Befehl aktualisiert.
ANALYZE Table BIGEMP compute statistics;
Select EMPTY_BLOCKS, AVG_SPACE from USER_TABLES where table_name = 'BIGEMP';
EMPTY_BLOCKS AVG_SPACE
------------ ----------
1019 838
Nun wird jeder zweite Datensatz gelöscht und die Tabelle neu analysiert.
Delete from bigemp where empno in(7369, 7521, 7654, 7782, 7839, 7876, 7902);
Commit;
ANALYZE Table BIGEMP compute statistics;
Bei der folgenden Prüfung auf Blöcke und Extents hat sich keine Veränderung ergeben.
Select BLOCKS, EXTENTS from USER_SEGMENTS where SEGMENT_NAME = 'BIGEMP';
BLOCKS EXTENTS
------ ----------
45696 116
Die Prüfung der leeren Blöcke und des freien Patzes ergibt, dass die Blöcke unverändert sind, aber der freie Platz größer geworden ist.
Select EMPTY_BLOCKS, AVG_SPACE from USER_TABLES where table_name = 'BIGEMP';
EMPTY_BLOCKS AVG_SPACE
------------ ----------
1019 4254
Jetzt starten wir mit dem Verkleinern der Tabelle. Dazu wird ROW MOVEMENT aktiviert, die Tabelle verkleinert und neu analysiert.
Alter Table BIGEMP ENABLE ROW MOVEMENT;
Alter Table BIGEMP SHRINK SPACE;
ANALYZE Table BIGEMP compute statistics;
Bei der abschließenden Prüfung auf Blöcke und Extents kann festgestellt werden, dass die Anzahl der Blöcke und Extents deutlich abgenommen hat.
Select BLOCKS, EXTENTS from USER_SEGMENTS where SEGMENT_NAME = 'BIGEMP';
BLOCKS EXTENTS
------ ----------
21208 92
Auch die Anzahl der leeren Blöcke und der freie Platz sind nach dem SHRINK deutlich kleiner geworden.
Select EMPTY_BLOCKS, AVG_SPACE from USER_TABLES where table_name = 'BIGEMP';
EMPTY_BLOCKS AVG_SPACE
------------ ---------
187 396
Zusammenfassung:
Die neue Funktionalität ALTER TABLE SHRINK ist ideal dafür geeignet, im laufenden Betrieb Tabellen zu verkleinern und die HIGH WATER MARK zurückzusetzen. Es kann somit auf einfache Art ungenutzter Platz innerhalb eines Tablespaces zur Verfügung gestellt werden.
Mehr Informationen zu diesem Thema und zu weiteren Funktionen in 10g erhalten Sie auch in unserem Kurs: Neuerungen von Oracle 10g (MS 1080).
Niederlassungen
Witneystraße
089 6228 6789-0
Grünwalder Weg
089 679090-40
E-Mail:
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.