必要以上にスペースを取っているように見えるテーブルがあります。データを新しいテーブルにコピーし、新しいテーブルと古いテーブルの名前を変更してそれらを交換することをお勧めします。現在のテーブルが実際に断片化されているかどうかを確認するにはどうすればよいですか?同じデータを含む新しいテーブルの新しいサイズを推定または計算するにはどうすればよいですか?
23864 次
3 に答える
2
統計が最新の場合、行データの量が示唆するよりも多くのブロックがテーブルにあるかどうかを適切に示す必要があります。
select table_name, round((num_rows * avg_row_len) /(8*1024)), blocks
from user_tables where ....
このスペースは将来の挿入に使用されるため、必ずしも問題になるとは限りません。大規模なアーカイブまたはデータの削除を行った場合は、スペースを再利用する価値がある場合があります(特に、全表スキャンを大量に行う場合)。[注:デフォルトである8kブロックを想定しています。]
CREATE / DROP / RENAMEを実行すると、インデックス、制約、付与(およびそれらを使用する場合はテーブルコメント)が失われます。
現在のテーブルスペースを確認し(USER_SEGMENTSを参照)、ALTER TABLE tablename MOVE current_tablespace;
インデックスを後で再構築する必要もあります。USER_INDEXESからそれらを選択し、ALTER INDEX ... REBUILD;
于 2011-06-15T00:05:56.693 に答える
0
--DBAとして接続されたsvrmgrlを使用してこのスクリプトを実行してみてください
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;
/
于 2011-06-14T11:11:15.787 に答える
0
パッケージdbms_space.space_usage
内のおよびその他の手順の使用を検討してください。dbms_space
于 2011-06-16T20:15:50.470 に答える