Oracle 高水位問題
阿新 • • 發佈:2018-11-07
什麽 刪除表 查看 統計 響應時間 from 調整 位置 預留空間
- Oracle 對數據段的管理有一個高水位(HWM, High Water Mark)的概念。高水位是數據段中使用過和未使用過的數據塊的分界線。高水位以下的數據塊是曾使用過的,以上的是從未被使用或初始化過的。
- 當 Oracle 進行全表掃描(FTS, Full table scan)的操作時,它會讀高水位下的所有數據塊。如果高水位下還有很多空閑空間(碎片),讀取這些空閑數據塊會降低操作的性能。
- 當針對一個表的刪除操作很多時,表會產生大量碎片。刪除操作釋放的空間不會被插入操作立即重用,甚至永遠也不會被重用,這被稱之為高水位問題;
如何檢查表是否有高水位問題?
- 收集表的統計信息
SQL> exec dbms_stats.gather_table_stats(ownname=>‘SCHEMA_NAME‘,tabname=> ‘TABLE_NAME‘);
- 查詢高水位表信息
/* Formatted on 2017/9/21 14:14:37 (QP5 v5.240.12305.39476) */ SELECT TABLE_NAME, ROUND((BLOCKS * 8), 2) "高水位空間 k", ROUND((NUM_ROWS * AVG_ROW_LEN / 1024), 2) "真實使用空間 k", ROUND((BLOCKS * 10 / 100) * 8, 2) "預留空間(pctfree) k", ROUND((BLOCKS * 8 - (NUM_ROWS * AVG_ROW_LEN / 1024) - BLOCKS * 8 * 10 / 100), 2) "浪費空間 k" FROM USER_TABLES WHERE TEMPORARY = ‘N‘ ORDER BY 5 DESC;
- 查看上次收集的統計時間
select table_name,last_analyzed from dba_tables where owner = ‘SCHEMA_NAME‘
- 收集整個 Schema 中對象的統計信息
SQL> exec dbms_stats.gather_schema_stats(ownname=>‘SCHEMA_NAME‘);
高水位問題會產生什麽不好的影響?
- 查詢響應時間(尤其是全表掃描)變慢
- 產生大量行遷移
- 浪費空間
如何解決高水位問題?
10g之前有兩種方式
- 導出表,刪除表,再導入表
- alter table move (一般選擇第二種,但是不能在線進行而且需要重建索引)
10g之後
提供 shrink 命令,需要表空間是基於自動段管理的,分兩步走:
- 第一步:整理表,不影響DML操作
alter table TABLE_NAME enable ROW MOVEMENT;--啟動行移動功能
alter table TABLE_NAME shrink space compact; --只整理碎片 不回收空間
- 第二步:重置高水位,此時不能有DML操作
alter table TABLE_NAME shrink space; --整理碎片並回收空間,並調整水位線。業務少時執行
alter table TABLE_NAME disable ROW MOVEMENT;--關閉行移動
也可以一步到位:
alter table TABLE_NAME shrink space;
shrink 的優勢:不需要重建索引。可以在線操作。
註意 :segment shrink執行的兩個階段:
- 數據重組(compact):通過一系列insert、delete操作,將數據盡量排列在段的前面。在這個過程中需要在表上加RX鎖,即只在需要移動的行上加鎖。由於涉及到rowid的改變,需要enable row movement.同時要disable基於rowid的trigger.這一過程對業務影響比較小。
- HWM調整:第二階段是調整HWM位置,釋放空閑數據塊。此過程需要在表上加X鎖,會造成表上的所有DML語句阻塞。在業務特別繁忙的系統上可能造成比較大的影響。
- 註意:shrink space語句兩個階段都執行。shrink space compact只執行第一個階段。如果系統業務比較繁忙,可以先執行shrink space compact重組數據,然後在業務不忙的時候再執行shrink space降低HWM釋放空閑數據塊。
Oracle 高水位問題