Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Compactar base de datos

Estas en el tema de Compactar base de datos en el foro de Oracle en Foros del Web. Buenos días, Para compactar una base de datos (eliminar huecos libres en las tablas) se puede hacer con las sentencias ALTER TABLE (nombre tabla) ENABLE ...
  #1 (permalink)  
Antiguo 30/06/2008, 05:22
 
Fecha de Ingreso: junio-2008
Mensajes: 9
Antigüedad: 16 años, 4 meses
Puntos: 0
Compactar base de datos

Buenos días,

Para compactar una base de datos (eliminar huecos libres en las tablas) se puede hacer con las sentencias ALTER TABLE (nombre tabla) ENABLE ROW MOVEMENT; ALTER TABLE (nombre tabla) SHRINK SPACE COMPACT; y ALTER TABLE (nombre tabla) SHRINK SPACE.

Pero lo que me interesa es ¿cómo puedo hacer un simulacro de estas sentencias? o ¿existe alguna sentencia SQL que me diga el tamaño que tendrá la base de datos después de compactarla?

Gracias de antemano.
  #2 (permalink)  
Antiguo 30/06/2008, 05:34
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Compactar base de datos

Hola,

Tienes el package DBMS_SPACE para ver informacion sobre la utilizacion de bloques en un segmento, a partir de ahi puedes estimar el espacio que vas a ganar.

http://www.psoug.org/reference/dbms_space.html

Saludos
  #3 (permalink)  
Antiguo 30/06/2008, 08:10
 
Fecha de Ingreso: junio-2008
Mensajes: 9
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Compactar base de datos

Hola,

gracias por el enlace!, la verdad que aún no tengo mucha experiencia con Oracle.

Te paso las sentencias que he ejecutado y el error que me aparece a ver si me puedes hechar una mano.

SQL> set serveroutput on
SQL> DECLARE
2 su NUMBER;
3 sa NUMBER;
4 cp NUMBER;
5 BEGIN
6 dbms_space.object_space_usage('UWCLASS', 'SERVERS', 'TABLE', NULL, su, sa, cp);
7 dbms_output.put_line('Space Used: ' || TO_CHAR(su));
8 dbms_output.put_line('Space Allocated: ' || TO_CHAR(sa));
9 dbms_output.put_line('Chained Percentage: ' || TO_CHAR(cp));
10 END;
11 /
DECLARE
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SYS.DBMS_SPACE", line 1828
ORA-06512: at line 6



Gracias!
  #4 (permalink)  
Antiguo 30/06/2008, 08:37
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Compactar base de datos

Hola,

El package DBMS_SPACE no encuentra la tabla por la que preguntas, intenta conectarte a la base de datos con el usuario propietario del objeto y reemplaza

Código:
dbms_space.object_space_usage('UWCLASS', 'SERVERS', 'TABLE', NULL, su, sa, cp);
por esto

Código:
dbms_space.object_space_usage(user, 'SERVERS', 'TABLE', NULL, su, sa, cp);
Esto asumiendo que el nombre SERVERS es correcto.

Saludos
  #5 (permalink)  
Antiguo 30/06/2008, 09:05
 
Fecha de Ingreso: junio-2008
Mensajes: 9
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Compactar base de datos

Hola,

efectivamente me había colado con el nombre de la tabla. Ya he conseguido que la sentencia se ejecute correctamente.

De todas formas, aún no tengo claro que apartado utilizar del link para el fin que estoy buscando. Yo creo que es el "dbms_space.space_usage".

No hay forma de hacerlo a un tablespace completo??

mushisimas gracias!
  #6 (permalink)  
Antiguo 30/06/2008, 09:17
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Compactar base de datos

Hola,

El paquete te va a dar informacion sobre segmentos, no tablespaces, por lo tanto tendras que hacer un pequeño script para buscar todas las tablas de un tablespace. Utiliza las vistas dba_segments, dba_tablespaces, dba_free_space para mas informacion.

Saludos
  #7 (permalink)  
Antiguo 30/06/2008, 09:43
 
Fecha de Ingreso: junio-2008
Ubicación: D.F.
Mensajes: 62
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Compactar base de datos

Hola Que Tal,

Matanga ya te dió toda la información correspondiente para calcular el espacio para un segmento en particular (de una tabla).

Creo que lo único que le Faltó fue mencionar la vista all_tables de la cual puedes obtener todas las tablas que pertenecen a un determinado tablespace.

SELECT table_name
FROM all_tables
WHERE tablespace_name = 'NOMBRE_TABLESPACE'
/

Saludos.
  #8 (permalink)  
Antiguo 30/06/2008, 09:48
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Compactar base de datos

Hola OscarH,

El tema es, que la dba_segments es mas acertada porque no solo las tablas ocupan espacio en un tablespace, esa es precisamente la definicion de segmento, todo objeto que ocupe espacio fisico en una base de datos, por lo tanto si quiero ver la utilizacion o los tablespace donde estan los indices, no voy a poder hacerlo en la all_tables.

Saludos
  #9 (permalink)  
Antiguo 30/06/2008, 10:25
 
Fecha de Ingreso: junio-2008
Ubicación: D.F.
Mensajes: 62
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Compactar base de datos

Es cierto, tienes razón Matanga, ya que si quieres ver el Total y no solo el de las tablas, tienes que trabajar a nivel segmento donde cada segmento corresponde a cada objeto contenido en un determinado tablesapece y la relación es el nombre del Objeto. nombre_objeto = nombre_segmento.

Saludos.
  #10 (permalink)  
Antiguo 01/07/2008, 03:13
 
Fecha de Ingreso: junio-2008
Mensajes: 9
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Compactar base de datos

Hice los siguientes pasos sobre una tabla:

1- Lanzo estas consultas antes de reorganizar la tabla.
"Begin
dbms_space.space_usage('SAPSR3','DOKCLU', 'TABLE', :unfblock, :unfbyte, :fs1block, :fs1byte, :fs2block, :fs2byte, :fs3block, :fs3byte, :fs4block, :fs4byte, :fullblock, :fullbyte);
end;
/"

RESULTADO:
************************************************** **************
UNFBLOCK UNFBYTE FS4BLOCK FS4BYTE FS3BLOCK FS3BYTE FS2BLOCK
----------- ----------- ----------- ----------- ----------- ----------- -----------
0 0 12202 99958784 15 122880 7

FS2BYTE FS1BLOCK FS1BYTE FULLBLOCK
----------- ----------- ----------- -----------
57344 0 0 64937
************************************************** **************
################################################## ##
QUERY 2
################################################## #
BEGIN
DBMS_SPACE.UNUSED_SPACE('SAPSR3','APQD', 'TABLE', :totalblocks, :totalbytes, :unblock, :unbytes, :last_ext_file_id, :last_ext_block_id, :partition);
END;
/

RESULTADO
************************************************** ***************
TOTALBLOCKS TOTALBYTES UNBLOCK UNBYTES
----------- ---------- ---------- ----------
77824 637534208 256 2097152

LAST_EXT_FILE_ID LAST_EXT_BLOCK_ID PARTITION
---------------- ----------------- -----------------
14 181897 768
************************************************** ***************
################################################## ##
REORGANIZO LA TABLA Y LANZO LAS CONSULTAS DE NUEVO
################################################## ##
RESULTADO CONSULTA 1

UNFBLOCK UNFBYTE FS4BLOCK FS4BYTE FS3BLOCK FS3BYTE FS2BLOCK
----------- ----------- ----------- ----------- ----------- ----------- -----------
0 0 0 0 0 0 0

FS2BYTE FS1BLOCK FS1BYTE FULLBLOCK FULLBYTE
----------- ----------- ----------- ----------- -----------
0 0 0 64801 530849792
************************************************** ***************
RESULTADO CONSULTA 2
************************************************** ***************
TOTALBLOCKS TOTALBYTES UNBLOCK UNBYTES
----------- ---------- ---------- ----------
65160 533790720 0 0

LAST_EXT_FILE_ID LAST_EXT_BLOCK_ID PARTITION
---------------- ----------------- -----------------
20 102281 648
************************************************** ***************

Os muestro que significa cada campo:

campos consulta 1:

UNFBLOCK Total number of blocks that are unformatted
UNFBYTE Total number of bytes that are unformatted
FS4BLOCK Number of blocks that has at least 0 to 25% free space
FS4BYTE Number of bytes that has at least 0 to 25% free space
FS3BLOCK Number of blocks that has at least 25 to 50% free space
FS3BYTE Number of bytes that has at least 25 to 50% free space
FS2BLOCK Number of blocks that has at least 50 to 75% free space
FS2BYTE Number of bytes that has at least 50 to 75% free space
FS1BLOCK Number of blocks that has at least 75 to 100% free space
FS1BYTE Number of bytes that has at least 75 to 100% free space
FULLBLOCK Total number of blocks that are full in the segment
FULLBYTE Total number of bytes that are full in the segment

Campos consulta 2:

total_blocks Returns total number of blocks in the segment.
total_bytes Returns total number of blocks in the segment, in bytes.
unused_blocks Returns number of blocks which are not used.
unused_bytes Returns, in bytes, number of blocks which are not used.
last_used_extent_ file_id Returns the file ID of the last extent which contains data.
last_used_extent_ block_id Returns the block ID of the last extent which contains data.
last_used_block Returns the last block within this extent which contains data.
partition_name Partition name of the segment to be analyzed.

////////////////////////////////////////////////////////////////////////////////////////////////////////


Esto ha sido una prueba para comprobar que realmente las consultas me muestran que la tabla ha reducido, pero lo que me interesa es saber cuánto va a ocupar la tabla con sólo ver las primeras consultas.

No estoy seguro de que puedo sacar esta información unicamente con las primeras consultas.

Si estoy equivocado (posiblemente ) agradecería que me orientarais como estimar el tamaño de un objeto después de organizarlo.

Gracias!
  #11 (permalink)  
Antiguo 01/07/2008, 04:40
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Compactar base de datos

Hola,

No se por donde empezar, vas a tener que leer teoria porque no puedo resumir varias cosas en un solo post.

1. El calculo que puedas obtener siempre va a ser estimado, la idea es que sumes la cantidad de espacio libre de todos los bloque que se reporten como unused o 0% a 75% de espacio libre. Para esto busca por el concepto de Segment Space Management Auto de los tablespaces.

2. La gran ventaja de un alter table shrink no es reducir el espacio ocupado (los discos son cada vez mas baratos), si no, reducir los tiempos de las consultas, como por ejemplo un FULL SCAN, dado que recorre todos los bloques de una tabla hasta la high water mark, tengan datos o no, esten al 100% ocupados o no.

3. La segunda gran ventaja del alter table shrink por sobre el alter table move (los dos tienen el mismo efecto) es que es online, por lo tanto no hace falta tanta planificacion a la hora de ejecutar el comando.

Por ultimo, intenta postear el output del SQL*Plus dentro de las etiquetas [ code ] y [ /code ] para una mejor visulizacion.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:52.