2011-06-14 73 views
2

我有一張表,它似乎佔用了比需要更多的空間。我建議將數據複製到新表中,並重命名新表和舊錶以交換它們。我如何確認當前表是否實際上是零散的?我如何估計或計算包含相同數據的新表的新大小?我如何知道Oracle中的表是否被分割?

+0

要小心,如果你複製和重命名爲每個索引,觸發器,約束等將保持鏈接到舊版本! – gpeche 2011-06-16 20:05:44

+0

@stuart請接受答案,如果其他人提供答案,如果你有。 – amod 2011-09-16 07:03:47

回答

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;

您需要重建索引aftwards了。從USER_INDEXES中選取它們並執行ALTER INDEX ... REBUILD;

0

- 嘗試運行使用SVRMGRL該腳本連接爲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; 
/
+1

svrmgrl?這是Oracle 8i! – DCookie 2011-06-14 13:40:50

+0

回到未來第四部分:-)對不起,我已經複製並粘貼,沒有想到;-) – UltraCommit 2011-06-14 19:02:02

相關問題