Oracle 10 g – Speicherplatz im Tablespace kann nicht freigegeben werden

Oracle 10 g – Speicherplatz im Tablespace kann nicht freigegeben werden

Der Tablespace in Oracle 10g ist fast zu 100 % genutzt.

Größe (MB) = 571.768,0 Verwendet (MB) = 571.534,0

Ich habe gerade Tausende von Datensätzen in einer Tabelle gelöscht (und festgeschrieben), die zu einem mit diesem Tablespace verknüpften Schema gehört. Überraschenderweise wurde laut der Tablespaces-Seite im Enterprise Manager kein Speicherplatz freigegeben.

Frage: Muss ich irgendetwas tun, um Oracle zu zwingen, den Speicherplatz für die gelöschten Datensätze freizugeben?

Antwort1

Tabelle ändern {table_name} Zeilenbewegung aktivieren;

Tabelle {Tabellenname} ändern, Speicherplatz verkleinern;

Antwort2

Die Seite, die Sie im Enterprise Manager betrachten, zeigt mit ziemlicher Sicherheit den freien Speicherplatz an, indem sie DBA_DATA_FILES(die Gesamtgröße der verschiedenen Dateien, die einem Tablespace zugewiesen sind, wird angezeigt) mit DBA_SEGMENTS(die Gesamtgröße aller Segmente, die Objekten im Tablespace zugewiesen sind, wird angezeigt) vergleicht. Dies ändert sich nicht, nur weil Sie einige Daten gelöscht haben.

Wenn Sie Daten löschen, geben Sie Speicherplatz in den Blöcken und Bereichen frei, die einem bestimmten Objekt zugewiesen sind. Wenn Sie also 100 MB Daten aus der FOO-Tabelle (und den zugehörigen FOO-Indizes) löschen, verringert sich die Größe des FOO-Segments nicht. Aber in diesem Segment wäre jetzt Platz, der weitere 100 MB an Einfügungen in FOO aufnehmen könnte. Wenn Sie Speicherplatz aus FOO löschen, um Speicherplatz für andere Segmente im Tabellenbereich freizugeben, müssten Sie FOO nach dem Löschen der Daten neu organisieren – dies ist ein ziemlich komplizierter Prozess, der wahrscheinlich Ausfallzeiten sowie eine ganze Menge Tests erfordert. Sofern Sie die Größe eines Objekts nicht dauerhaft reduzieren, ist dies im Allgemeinen nicht ratsam – wenn FOO schließlich weitere 100 MB an Einfügungen sehen wird, ist es nicht sinnvoll, das FOO-Segment zu verkleinern, nur um es dann wieder wachsen zu lassen.

Sie können das Paket DBMS_SPACE verwenden, um zu sehen, wie viel Speicherplatz in verschiedenen Segmenten verfügbar ist. Dadurch erfahren Sie mehr über leere Blöcke sowie über Blöcke, die sich in verschiedenen Füllzuständen befinden (0-25 % voll, 25-50 % voll, 50-75 % voll und 75-100 % voll). Wenn Sie Daten löschen, führt dies im Allgemeinen zu einer Erhöhung der Anzahl der einer Tabelle zugewiesenen leeren und teilweise leeren Blöcke.

Antwort3

Als Folgemaßnahme zur akzeptierten Antwort können Sie den Segment Advisor (über einen Aufruf von dbms_advisor) verwenden, um die Platzersparnis durch die Ausführung des Shrink Space-Vorgangs abzuschätzen. [Sie benötigen kein Lizenzpaket, um den Segment Advisor auszuführen]

Sie könnten dann etwas Zeit sparen und sich nur auf die Segmente konzentrieren, von denen Sie den größten Nutzen erwarten.

Antwort4

Normalerweise ist es besser, eine temporäre Tabelle zu erstellen, indem Sie „create table temp_table name as select * from table_you_deleted_from“ verwenden. Löschen Sie anschließend die Indizes der Originaltabelle, deaktivieren Sie die Einschränkung, die auf diese Tabelle verweist, und löschen Sie diese Tabelle anschließend und erstellen Sie sie erneut, indem Sie „create table table_you_deleted_from name as select * from temp_table“ verwenden. Erstellen Sie Ihre Indizes neu und aktivieren Sie die Einschränkungen.

Hier haben Sie grundsätzlich Ihre Tabellengröße und Indexbaumlänge reduziert, d. h., Sie können künftig schneller abrufen.

verwandte Informationen