你可以把 table 想像成一個水庫, HWM是這個 table 使用空間最高的位置(水位線), Low HWM 則是目前資料的位置(水位線),HWM會隨著資料的新增一直往上漲。他有個特性就是他只會往上漲,不會因為資料的 delete 而自動跟著下跌。
Oracle 在 Select Full Table Scans 時,他則是掃瞄 HWM 水位線以下的 block,所以一個 table 的HWM有1000實際的資料只有10,Oracle 則是從 HWM 往下掃瞄,所以有人會說我的 table 資料很少,為什麼 select 很慢 或許就是HWM的太高。
那有沒有辦法把HWM調降呢?
1.truncate
在刪除整個 table 資料時就會把HWM降到0, 刪除較大的 table 時推薦使用 truncate 指令來刪除。
2.alter table table_name move tablespace xxxx;
使用搬移指令來把 table 搬移到其他 tablespace 來達到重組 table 的效果, 但記得 move 後得要重建索引。
3. alter table table_name shrink space;
就有點類似 windows 裡的硬碟重組工具的效果,把後面的資料盡量移到前面去再降HWM,
這個階段會造成rowid的改變,因此需要enable row movement.
alter table TABLE_NAME enable row movement;
接下來就是來看看哪些 table 需要 降 HWM
1.在這之前需要對 table 做 analyze
2.查詢一下 目前的高度與空閑 block, 目前高度為 1882, 空閑則有38
3.查詢 table 的佔用的 block 數有多少
要是覺得空閑的block 太多 就可以執行語法來降HWM已達到優化效果以下SQL 也可以查詢
SELECT *
FROM (SELECT a.owner,
a.table_name,
round ((b.BYTES /1024/1024/1024),2) as size_gb,
a.blocks,
a.empty_blocks,
b.blocks total_blocks,
round ((((B.blocks-A.BLOCKS)/B.BLOCKS) * 100),2) WASTE_PER,
A.tablespace_name
FROM (SELECT owner,
table_name,
num_rows,
blocks,
empty_blocks,
tablespace_name
FROM dba_tables) a,
(SELECT owner,
segment_name,
segment_type,
blocks,
bytes
FROM dba_segments) b
WHERE a.owner = b.owner
AND a.table_name = b.segment_name
AND B.segment_type = 'TABLE')
WHERE WASTE_PER IS NOT NULL AND WASTE_PER >30 AND BLOCKS >0 AND size_gb >1
ORDER BY WASTE_PER DESC;
沒有留言:
張貼留言