Segment Shrink
Consiste nel recuperare spazio sopra e sotto l'hwm (high-water mark), liberando spazio e resettando il valore di hwm.
Poiché vengono mosse le righe e cambiano i ROWIDs occorre abilitare la tabella alla modalità row movement e il tablespace di appartenenza deve eesere gestito in modalità ASSM (automatic segment space management).
SQL > alter table .... enable row movement;
Inoltre occorre disabilitare trigger, dml e query basati sul rowid.
Può essere eseguita on line pertanto durante lo shrink vengono bloccate le dml che operano su quei segmenti mentre gli indici risultano utilizzabili.
Può essere usato per i seguenti oggetti.
- Heap tables
- Index-organized tables and their overflow segments
- LOBs and LOB segments
- Materialized views and materialized view logs
- Indexes
- Partitions and subpartitions
Mentre la seconda query restituisce questo.
La clausola COMPACT deframmenta e compatta i blocchi della tabella ma non resetta l'HWM o libera spazio.
La clausola CASCADE invece applica lo shrink segment a tutti gli oggetti collegati alla tabella. Nel caso di tabella partizionata non è necessario applicare la suddetta clausola perché viene eseguito di default lo shrimk segment alle partizioni.
Poiché vengono mosse le righe e cambiano i ROWIDs occorre abilitare la tabella alla modalità row movement e il tablespace di appartenenza deve eesere gestito in modalità ASSM (automatic segment space management).
SQL > alter table .... enable row movement;
Inoltre occorre disabilitare trigger, dml e query basati sul rowid.
Può essere eseguita on line pertanto durante lo shrink vengono bloccate le dml che operano su quei segmenti mentre gli indici risultano utilizzabili.
Può essere usato per i seguenti oggetti.
- Heap tables
- Index-organized tables and their overflow segments
- LOBs and LOB segments
- Materialized views and materialized view logs
- Indexes
- Partitions and subpartitions
select SEGMENT_NAME, BLOCKS ,bytes
from dba_segments
where segment_type='TABLE'
and TABLESPACE_NAME= 'TS_PEPT_DATA'
and segment_name = 'DOPO_SNAPSHOT'
SEGMENT_NAME BLOCKS BYTES
---------- -------------------------------------------------
DOPO_SNAPSHOT 8 65536
Eseguo diverse insert e delete e ottengo.
SEGMENT_NAME BLOCKS BYTES
---------- ----------------------------------------------------------
DOPO_SNAPSHOT 56 458752
select * from dba_extents where owner ='PEPT' and segment_name = 'DOPO_SNAPSHOT'
SQL> alter table pept.DOPO_SNAPSHOT enable row movement;
SQL> alter table pept.DOPO_SNAPSHOT SHRINK SPACE;
Rieseguendo la prima query ottengo:
SEGMENT_NAME BLOCKS BYTES
---------- -----------------------------------------------------------
DOPO_SNAPSHOT 16 131072
Mentre la seconda query restituisce questo.
SQL> alter table pept.DOPO_SNAPSHOT SHRINK SPACE COMPACT;
SQL> alter table pept.DOPO_SNAPSHOT SHRINK SPACE CASCADE;
Da Enterprise Manager 12 andare sotto Amministrazione > Memoria > Segment Advisor
Cliccare su Advisor Central
Cliccare su Segment Advisor
Selezionare oggetti dello schema