Mittwoch, Januar 03, 2007

Verkleinerung von LOB-Segmenten


Nachtrag am 19.10.2010: inzwischen muss ich von der hier vorgestellten Operation abraten, da sie einen recht häßlichen Bug auf den Plan rufen kann.

In Oracle 10g können Tabellen über ein ALTER TABLE ... SHRINK im laufenden Betrieb reorganisiert und verkleinert werden. Durch die CASCADE-Option werden auch abhängige Objekte wie Indizes und LOBs verkleinert. Voraussetzung für den Einsatz dieses Features ist ein Tablespace, für den ASSM (Automatic Segment Space Management) aktiviert ist (das ist bei uns und per default der Fall), außerdem muss für die entsprechende Tabelle das <row movement> aktiviert werden, so dass die physikalische Adresse der Einträge geändert werden kann:

select segment_name
     , bytes
  from user_segments
 where segment_name IN (select segment_name
                          from user_lobs
                         where table_name = 'SIMPLENODECONTENT')
    or segment_name = 'SIMPLENODECONTENT';

SEGMENT_NAME                        BYTES
------------------------------ ----------
SYS_LOB0000109571C00002$$       855638016
SIMPLENODECONTENT                 7340032

alter table simplenodecontent enable row movement;

Tabelle wurde geändert.

-- diese Operation kann längere Zeit in Anspruch nehmen:
alter table simplenodecontent shrink space cascade;

Tabelle wurde geändert.

Abgelaufen: 00:02:34.96

alter table simplenodecontent disable row movement;

Tabelle wurde geändert.

select segment_name
     , bytes
  from user_segments
 where segment_name IN (select segment_name
                          from user_lobs
                         where table_name = 'SIMPLENODECONTENT')
    or segment_name = 'SIMPLENODECONTENT';

SEGMENT_NAME                        BYTES
------------------------------ ----------
SYS_LOB0000109571C00002$$       158466048
SIMPLENODECONTENT                 1769472