空間不夠,加硬碟就夠了,但要是沒辦法加硬碟呢
DBA 就要想辦法榨出空間出來
我們都知道 Table 再被刪除資料時 他並不會把空間釋放 ,必須要由DBA 來主動幫 Table來瘦身
首先粗略找出DB內空閑空間最多的 Table (浪費空間比超過45%,且table size大於
SELECT *找出之後 在使用指令 alter table table_name shrink space;
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;
使用以上語法並不會把 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