Frage

Ich habe einen Tisch, der mehr Platz in Anspruch nimmt als nötig. Mir wurde empfohlen, die Daten in eine neue Tabelle zu kopieren und die neue Tabelle und die alte Tabelle umzubenennen, um sie auszutauschen. Wie kann ich bestätigen, ob eine aktuelle Tabelle tatsächlich fragmentiert ist? Wie kann ich die neue Größe der frischen Tabelle mit denselben Daten schätzen oder berechnen?

War es hilfreich?

Lösung

Wenn Ihre Statistiken auf dem neuesten Stand sind, sollte dies einen anständigen Hinweis geben, ob Tabellen viel mehr Blöcke haben, als das Volumen der Zeilendaten vorschlägt.

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

Dieser Raum würde für zukünftige Einsätze verwendet, ist also kein Problem. Wenn Sie ein großes Archiv oder Daten gelöscht haben, ist dies kann Seien Sie es wert, Raum zurückzugewinnen (besonders wenn Sie viele volle Tischscans durchführen). [Hinweis: Ich habe 8K -Blöcke angenommen, die die Standardeinstellung sind.

Wenn Sie ein Erstellen/Drop/Umbenennen durchführen, verlieren Sie alle Indizes, Einschränkungen, Zuschüsse (plus Tabellenkommentare, wenn Sie sie verwenden).

Sie sind besser dran, den aktuellen Tablespace zu überprüfen (user_segmments schauen) und eine ausführen ALTER TABLE tablename MOVE current_tablespace;

Sie müssen auch nach hinten wieder aufbauen. Wählen Sie sie aus user_indexes und machen Sie eine ALTER INDEX ... REBUILD;

Andere Tipps

- Versuchen Sie, dieses Skript mithilfe von SVRMGRL auszuführen, die als DBA verbunden ist

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;
/

Erwägen Sie zu verwendendbms_space.space_usage und andere Verfahren in der dbms_space Paket.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top