ORACLE高水位表的查詢方法

bitifi發表於2015-09-22

 

  1. 高水位的介紹

資料庫執行了一段時間,經過一些列的刪除、插入、更改操作有些表的高水位線就有可能和實際的表儲存資料的情況相差特別多,為了提高檢索該表的效率,建議對這些表進行收縮;

  1. 查詢高水位線的表

  1. 查詢表需要的儲存空間:表以資料塊的形式儲存在資料檔案中,表的儲存結構是:行×行數,如果知道了總共有多少行,每行的平均長度,兩者相乘,再除於90%的使用率,那麼就可以知道實際需要儲存的空間;

    表的儲存結構;

            
            
            
            

    從統計資訊得出平均每行的長度和總共的行數,從而知道儲存的SIZE;

  2. 查詢表實際儲存的空間:資料實際儲存在資料檔案中是以塊的形式儲存的,每個資料檔案8K,塊的數量乘於8k,就可以知道實際已經儲存的空間是多少了;

    c) 查詢資料庫中某個表空間下,可以實際儲存和需要的表空間差別最大的表,查詢指令碼如下:

    SELECT NUM_ROWS,AVG_ROW_LEN*NUM_ROWS/1024/1024/0.9 NEED, BLOCKS*8/1024 TRUE,(BLOCKS*8/1024-AVG_ROW_LEN*NUM_ROWS/1024/1024/0.9) RECOVER_MB,TABLE_NAME

    FROM dba_tables

    WHERE tablespace_name='PSAPSR3' AND BLOCKS*8/1024-AVG_ROW_LEN*NUM_ROWS/1024/1024/0.9>100

    AND rownum<11 order by RECOVER_MB desc;

    1. 統計資訊的更新

因為所有的資訊都是根據dba_tables,表的資訊是根據統計資訊得到的,所以如果統計資訊不準確,那麼整個搜尋的結果都可能是錯誤的;

統計資訊的指令碼:exec dbms_stats.gather_table_stats('user','table_name');

  1. 回收的操作

a) 啟動行遷移:alter table table_name enable row movement ;

b)進行表的收縮:alter table table_name shrink space ;

  1. 檢查結果

SQL> select t.table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS

from user_tables

where table_name = upper('table_name');

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本文作者:JOHN

ORACLE技術部落格:ORACLE 獵人筆記               資料庫技術群:367875324 (請備註ORACLE管理 )  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1806074/,如需轉載,請註明出處,否則將追究法律責任。

相關文章