Woher weiß ich, ob eine Tabelle in Orakel fragmentiert ist?
-
27-10-2019 - |
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?
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.