2013年12月18日 星期三

Oracle - 如何查 Table 有沒有浪費空間

管理DB上最令人頭痛的問題是 硬碟空間,很好解決也很頭痛的問題。
空間不夠,加硬碟就夠了,但要是沒辦法加硬碟呢

DBA 就要想辦法榨出空間出來



我們都知道 Table 再被刪除資料時 他並不會把空間釋放 ,必須要由DBA 來主動幫 Table來瘦身


首先粗略找出DB內空閑空間最多的 Table (浪費空間比超過45%,table size大於1GB )
  SELECT *
    FROM (SELECT OWNER,
                 TABLE_NAME,
                 SIZE_MB,
                 USE_SPACE_MB,
                 EMPTY_SPACE_MB,
                 ROUND ( (EMPTY_SPACE_MB / SIZE_MB) * 100, 2) ASTE_PER,
                 TABLESPACE_NAME
            FROM (SELECT OWNER,
                         table_name,
                         ROUND ( (blocks * 8) / 1024, 2) "SIZE_MB",
                         ROUND ( (num_rows * avg_row_len / 1024 / 1024), 2) "USE_SPACE_MB",
                         ROUND (
                              (blocks * 8 - (num_rows * avg_row_len / 1024))
                            / 1024,  2) "EMPTY_SPACE_MB",
                         TABLESPACE_NAME
                    FROM dba_tables))
   WHERE EMPTY_SPACE_MB > 0 AND SIZE_MB > 1024 AND WASTE_PER > 45
ORDER BY 6 DESC;
找出之後 在使用指令  alter table table_name shrink space;



使用以上語法並不會把 Table 內的欄位含有 long blob 等等 大型類型 的 Size 計算進去
要更精準的算法, 首先使用 analyze table t compute statistics;

分析完後 看一下dba_tables 該 Table 的 empty_blocks 就會出現值了, 再把empty_blocks  * 8 (我這邊設定1個block是8K)

就可以知道 空閑空間與 Size 的比了

目前只有 analyze  指令 能收集 已下空間訊息
EMPTY_BLOCKS,
AVG_SPACE,
CHAIN_CNT

沒有留言:

張貼留言