Zu Oracle

Bereich:
Versionsinfo:
DBA, SQL
10.1, 10.2, 11.1, 11.2
Erstellung:
Letzte Überarbeitung:
12/2005 MP
06/2009 MA
 Als PDF Downloaden!

ALTER TABLE SHRINK

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:

  • Oracle RDBMS ab Version 10g.
  • Der Tablespace muss mit der Option SEGMENT MANAGEMENT AUTO angelegt sein.
  • Bei der Tabelle, die verkleinert werden soll, muss ROW MOVEMENT aktiviert sein. Die Tabelle muss reorganisiert werden und damit ändern sich die ROWIDS.

Einschränkungen:

  • Die Tabelle darf nicht komprimiert sein.
  • Die Tabelle darf keine FUNCTION BASED Indizes besitzen.
  • Die Mastertabelle einer ON COMMIT MATERIALIZED VIEW kann nicht verkleinert werden.
  • ROWID MATERIALIZED VIEWS müssen nach dem Verkleinern neu aufgebaut werden.
  • Die Tabelle darf keine LOB oder LONG Spalten besitzen (nur in Version 10.1).

 

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).

Suche

Kontakt

Niederlassungen

  Witneystraße

    089 6228 6789-0

  Grünwalder Weg

    089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.