Un tablespace no deja de ser como un ‘disco’ en Oracle. Tras un tiempo realizando operaciones de inserción y borrado puede ser que el uso del tablespace esté por debajo del 50% pero  no podamos reducir los datafiles ya que hay objetos en las zonas ‘altas’ del tablespace.

Cómo saber qué objectos se encuentran a partir de digamos un ‘porcentaje’ del tablespace?

La query ‘básica’ es:

select * from dba_extents where tablespace_name = ‘TBSNAME’ order by block_id;

Para poder delimitar a partir de qué bloque nos interesa tomar los objetos en consideración, basta con hacer un simple cálculo. Primero averiguamos en cuanto está el tamaño de bloque de la base de datos:

select value from v$parameter where name = ‘db_block_size’;

Tomando el valor como 8192 bytes, cogemos el tablespace TBSNAME y vemos el tamaño de sus datafiles (que normalmente suelen ser los mismos o similares). Pongamos que son de 25.600.000 kb, haciendo la división con los 8192 bytes por bloque obtenemos 3.200.000. Si queremos determinar pues los objetos que estén más allá del 50% del espacio físico eso serían objetos a partir del bloque 1.600.000 (es importante recordar que aquí no se hace diferenciación según el datafile).

Con eso sacamos una query tipo:

select * from dba_extents where tablespace_name = ‘TBSNAME’ and block_id > 1600000 order by block_id;