我有一張表,它似乎佔用了比需要更多的空間。我建議將數據複製到新表中,並重命名新表和舊錶以交換它們。我如何確認當前表是否實際上是零散的?我如何估計或計算包含相同數據的新表的新大小?我如何知道Oracle中的表是否被分割?
回答
如果統計是最新的,這應該給一個體面的跡象,如果表中有很多更比塊行的數據量建議。
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;
- 嘗試運行使用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;
/
svrmgrl?這是Oracle 8i! – DCookie 2011-06-14 13:40:50
回到未來第四部分:-)對不起,我已經複製並粘貼,沒有想到;-) – UltraCommit 2011-06-14 19:02:02
考慮在dbms_space
包中使用dbms_space.space_usage
和其他過程。
- 1. 如何知道PHAsset是否被修改?
- 2. ORACLE - 如何知道任何視圖是否使用表?
- 3. 如何知道表單是否未被選中?
- 4. 知道Oracle中是否更新記錄?
- 5. 如何知道我的頁面是否被緩存?
- 6. 如何停止我不知道的NSTimer是否被釋放
- 7. 如何知道所有碎片是否被分離?
- 8. 如何知道表是否是數組?
- 9. 我如何知道對象是否可以被弱引用?
- 10. 我如何知道json web令牌是否被篡改
- 11. 如何知道網格中的項目是否被選中?
- 12. 我如何知道我的html鏈接是否從Servlet中被點擊?
- 13. 如何知道表單是否已被修改
- 14. 如何知道是否一個std ::列表已被修改
- 15. Teradata鎖 - 如何知道表是否被鎖定?
- 16. 如何知道我是否在回傳?
- 17. 我如何知道Rabbitmq是否成功?
- 18. 如何知道表是否爲空?
- 19. 我如何知道CheckBox被選中?
- 20. 如何知道是否複選框被選中或不Django的
- 21. 如何知道某個記錄是否不存在於Oracle的表格中
- 22. 如何知道列表中的任何項目是否已被雙擊?
- 23. 如何知道是否
- 24. python - 如何知道什麼是用於分割字符串?
- 25. 我如何知道分支機構是否入圍GIT
- 26. 如何知道我是否需要保留或分配房產?
- 27. 當我知道我的模塊是否被prestashop插件接受?
- 28. 我如何知道推送通知是否在iOS中傳遞?
- 29. 如何知道我的存儲過程是否在MS SQL Server中被刪除?
- 30. Iphone 4 sdk - 我如何知道applicationWillEnterForeground是否由於通知而被觸發?
要小心,如果你複製和重命名爲每個索引,觸發器,約束等將保持鏈接到舊版本! – gpeche 2011-06-16 20:05:44
@stuart請接受答案,如果其他人提供答案,如果你有。 – amod 2011-09-16 07:03:47