Pregunta

Tengo una mesa que parece estar ocupando más espacio del que necesita. Me han aconsejado copiar los datos a una nueva tabla y cambiar el nombre de la nueva tabla y la tabla antigua para intercambiarlos. ¿Cómo puedo confirmar si una tabla actual está realmente fragmentada? ¿Cómo puedo estimar o calcular el nuevo tamaño de la mesa fresca que contiene los mismos datos?

¿Fue útil?

Solución

Si sus estadísticas están actualizadas, esto debería dar una indicación decente si las tablas tienen muchos más bloques de los que sugiere el volumen de datos de fila.

select table_name, round((num_rows * avg_row_len) /(8*1024)), blocks 
from user_tables where ....

Este espacio se utilizaría para futuros insertos, por lo que no es necesariamente un problema. Si ha realizado un gran archivo o eliminación de datos, mayo Vale la pena reclamar espacio (especialmente si hace muchos escaneos de mesa completos). [Nota: Asumí 8K bloques, cuáles son los valores predeterminados.

Si realiza un creación/suelta/renombra, perderá los índices, restricciones, subvenciones (más comentarios de la tabla si los usa).

Es mejor que verifique el espacio de tabla actual (busque user_segments) y haga un ALTER TABLE tablename MOVE current_tablespace;

También necesitará reconstruir índices después. Elegirlos de user_indexes y hacer un ALTER INDEX ... REBUILD;

Otros consejos

- Intente ejecutar este script usando SVRMGRL conectado como DBA

set serveroutput on

DECLARE
   libcac   NUMBER (6, 2);
   rowcac   NUMBER (6, 2);
   bufcac   NUMBER (6, 2);
   redlog   NUMBER (6, 2);
   spsize   NUMBER;
   blkbuf   NUMBER;
   logbuf   NUMBER;
BEGIN
   SELECT VALUE
     INTO redlog
     FROM v$sysstat
    WHERE name = 'redo log space requests';

   SELECT 100 * (SUM (pins) - SUM (reloads)) / SUM (pins)
     INTO libcac
     FROM v$librarycache;

   SELECT 100 * (SUM (gets) - SUM (getmisses)) / SUM (gets)
     INTO rowcac
     FROM v$rowcache;

   SELECT 100 * (cur.VALUE con.VALUE - phys.VALUE)/(cur.VALUE con.VALUE)
into bufcac
from v$sysstat cur,v$sysstat con,v$sysstat phys,
v$statname ncu,v$statname nco,v$statname nph
where cur.statistic# = ncu.statistic# and
ncu.name = 'db block gets' and
con.statistic# = nco.statistic# and
nco.name = 'consistent gets' and
phys.statistic# = nph.statistic# and
nph.name = 'physical reads';

select VALUE
into spsize
from v$parameter
where name = 'shared_pool_size';

select VALUE
into blkbuf
from v$parameter
where name = 'db_block_buffers';

select VALUE
into logbuf
from v$parameter
where name = 'log_buffer';

DBMS_OUTPUT.put_line('> SGA CACHE STATISTICS');
DBMS_OUTPUT.put_line('> ********************');
DBMS_OUTPUT.put_line('> SQL Cache Hit rate = '||libcac);
DBMS_OUTPUT.put_line('> Dict Cache Hit rate = '||rowcac);
DBMS_OUTPUT.put_line('> Buffer Cache Hit rate = '||bufcac);
DBMS_OUTPUT.put_line('> Redo Log space requests = '||redlog);
DBMS_OUTPUT.put_line('> ');
DBMS_OUTPUT.put_line('> INIT.ORA SETTING');
DBMS_OUTPUT.put_line('> ****************');
DBMS_OUTPUT.put_line('> Shared Pool Size = '||spsize||' Bytes');
DBMS_OUTPUT.put_line('> DB Block Buffer = '||blkbuf||' Blocks');
DBMS_OUTPUT.put_line('> Log Buffer = '||logbuf||' Bytes');
DBMS_OUTPUT.put_line('> ');

if libcac < 99
then
DBMS_OUTPUT.put_line('*** HINT: Library Cache too low! Increase the Shared Pool Size.');
end if;

if rowcac < 85
then
DBMS_OUTPUT.put_line('*** HINT: Row Cache too low! Increase the Shared Pool Size.');
end if;

if bufcac < 90
then
DBMS_OUTPUT.put_line('*** HINT: Buffer Cache too low! Increase the DB Block Buffer value.');
end if;

if redlog > 100
then
DBMS_OUTPUT.put_line('*** HINT: Log Buffer value is rather low!');
end if;

end;
/

Considere usardbms_space.space_usage y otros procedimientos en el dbms_space paquete.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top