LOBs unter Oracle sind, wie schon an einigen Stellen im Blog hier erwaehnt, wirklich eine suboptimale Storage-Loesung unter Oracle. Vor allem, wenn eine solche Tabelle auch noch alle x Monate bereinigt werden soll. Nach dem entsprechenden DELETE belegt das LOBSEGMENT naemlich immer noch gut Platz auf dem Tablespace. Was bei “normalen” Tabellen ueber ein “ALTER TABLE ENABLE ROW MOVEMENT” mit anschliessendem “ALTER TABLE SHRINK SPACE” geht, ist bei LOBSEGMENTEN nicht ganz so simpel. Und weil ich die beiden Sprueche immer wieder verwechsele, schreibe ich Sie jetzt hier auf:
Gegeben sei ein Table “DATASTORE” mit einem LOB der “FILEDATA” heisst.
Nur Shrinken (Nicht Highwatermark zuruecksetzen, also auch nicht Table “locken”):
SQL> alter table datastore modify lob (filedata) (shrink space compact);
Im Anschluss Highwatermark zuruecksetzen / Bzw. direkt vollstaendig shrinken (VORSICHT: Table wird gelockt):
SQL>alter table datastore modify lob (filedata) (shrink space);
PS: Das ganze laesst sich noch mit einem CASCADE erweitern, was dann bedeutet dass auch unterliegende Objekte mit geshrinkt werden (Indizes, etc.)