Ocupación REAL B.D.

Como puedo saber la ocupación real de una b.d. Trabajo con una aplicación que guarda en B.D. Ficheros binarios de gran tamaño. Dicha aplicación descarga dichos ficheros, pero no borrar los registros. Lo que hace es poner 'null' en el campo donde antes guardaba el binario. Posteriormente si me conecto con el DBA studio veo que el nivel de ocupación es el mismo que antes de efectuar la descarga.

1 Respuesta

Respuesta
En realidad tu problema es saber que espacio ocupa la tabla donde se almacenan los binarios. Te explico:
La única forma de saber esto es conociendo donde esta la Hight Water Mark, es decir la marca de agua de la tabla, para ello hay dos formas; la primera es consultando la tabla de catálogo dba_tables y la segunda ejecutando el paquete DBMS_SPACE. UNUSED_SPACE().
1ra. Debes tener actualizada las estadísticas de la BD o de la tabla. Una vez que tengas esto debes realizar el siguiente query:
select blocks+empty_blocks TOTAL_BLOQUES, empty_blocks BLOQUES_VACIOS from dba_tables
where table_name='TABLA';
OJO: En el lugar de TABLA debes colocar la tabla que deseas conocer.
Una vez que sepas esto debes multiplicar los valores de los bloques por el tamaño del bloque de la BD; esto lo obtienes del parámetro de la BD llamado: DB_BLOCK_SIZE. Luego divide el resultado entre 1024/1024 y tendrás el valor en Mb. REaliza esto antes y después de insertar el registro en la tabla y así sabrás en cuanto se incrementó el espacio ocupado.
2do. Debes haber cargado el script de catálogo: catproc.sql para que tengas creado el package DBMS_SPACE. Entonces procede de la siguiente manera:
a) Debes crear una unidad de programación PL/SQL en sqlplus donde declares las variables que necesitas pasar al package.
b) Abres el bloque con BEGIN y ejecutas: DBMS_SPACE.UNUSED_SPACE(.....);
dbms_output.put_line (....);
end;
/
Esto en realidad no es tan sencillo, previamente debes abrir el packege DBMA_SPACE e ir hasta el procedure de UNUSED_SPACE para saber cuales variables necesitas declarar y su tipo. EL DBMS_OUTPUT te sirve para mostrar en pantalla la salida del DBMS_SPACE y las variables que deseas que deben se las de total bloques y bloques no usados.
Te recomiendo que utilices el primer método ya que es más rápido.
Para calcular las estadísticas de una tabla en particular debes ejecutar esto:
analyze table <DUEÑO.TABLA> compute statistics;
Esa solución ya la había probado.
El problema es que mi aplicación de descarga, no borra registros (y ademas no puedo ni quiero borrarlos), si no que en el campo donde se guarda el binario (es un campo BLOB) inserta un NULL y el fichero lo guarda en un archivo en un servidor (son archivos de imagen). Yo se que libera espacio, por que desdues de realizar la descarga, estoy un tiempo si ver que aumenta la ocupación de mi tablespaces. Creo que oracle aprovecha el espacio que ha liberado, pero no puedo saber cuanto es.
Muchas gracias por anticipado.
Creo haber captado tu idea. Lo que oracle guarda en el campo no es la imagen, es la dirección donde se encuentra el archivo en el servidor, este se utiliza cuando tu accedes al registro. Pero en todo caso si deseas saber el espacio ocupado debes aplicar el procedimiento que te indiqué si es para una tabla; ahora, si tu lo deseas por tablespace, entonces debes sumar todos los espacios que te da por cada tabla y restarlo del total reservado para el tablespace y así sabrás la diferencia, la próximas veces que hagas esto podrás establecer comparaciones y saber lo que ha aumentado o disminuido si llegase a darse esto.
Oracle "SÍ" guarda la imagen, lo que pasa es que cuando hago la descarga de dichos registros al disco duro (se pone a NULL en el campo donde se guarda la imagen y en otro campo del registro la ubicación, ejemplo U:\xxx\xx.eps). Por lo que no encuentro la manera de ver la ocupación después de la descarga (sólo si hago un export y un import si que lo puedo ver).
Lo que te puede estar pasando es que no sigues viendo el mismo espacio ocupado debido a que no le calculas las estadísticas a la tabla luego de la descarga. Prueba esto:
1.- Ejecuta el query que ya te mencioné:
select blocks+empty_blocks TOTAL_BLOQUES, empty_blocks BLOQUES_VACIOS from dba_tables
where table_name='TABLA';
2.- Realiza la descarga.
3.- Hazle analyze a la tabla.
4.- Vuelve a ejecutar el query.
Esto te debe dar la diferencia en tamaño.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas