Question

J'ai une table qui semble prendre plus de place que nécessaire. On m'a conseillé de copier les données vers une nouvelle table et renommer la nouvelle table et ancienne table pour échanger les. Comment puis-je vérifier si une table en cours est en réalité fragmentée? Comment puis-je estimer ou calculer la nouvelle taille de la table frais contenant les mêmes données?

Était-ce utile?

La solution

Si vos statistiques sont à jour, cela devrait donner une indication correcte si les tables ont beaucoup plus de blocs que le volume de données de ligne suggère.

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

Cet espace sera utilisé pour les insertions futures, est donc pas nécessairement un problème. Si vous avez fait une grande archive ou supprimer des données, il peut être l'espace vaut la peine de récupération (surtout si vous faites beaucoup de scans de table). [Note:. J'ai supposé 8k blocs, qui sont la valeur par défaut]

Si vous faites un CREER / DROP / Rename vous perdrez tous les index, les contraintes, les subventions (plus les commentaires de la table si vous les utilisez).

Vous êtes mieux vérifier la tablespace actuelle (regard dans user_segments) et de faire un ALTER TABLE tablename MOVE current_tablespace;

Vous devrez reconstruire les index aftwards aussi. Cueillez-de USER_INDEXES et faire une ALTER INDEX ... REBUILD;

Autres conseils

- Essayez de lancer ce script en utilisant svrmgrl connecté en tant que 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;
/

Pensez à utiliser dbms_space.space_usage d'autres procédures dans le package dbms_space.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top