1. 程式人生 > >Oracle 高水位問題

Oracle 高水位問題

什麽 刪除表 查看 統計 響應時間 from 調整 位置 預留空間

  • Oracle 對數據段的管理有一個高水位(HWM, High Water Mark)的概念。高水位是數據段中使用過和未使用過的數據塊的分界線。高水位以下的數據塊是曾使用過的,以上的是從未被使用或初始化過的。
  • 當 Oracle 進行全表掃描(FTS, Full table scan)的操作時,它會讀高水位下的所有數據塊。如果高水位下還有很多空閑空間(碎片),讀取這些空閑數據塊會降低操作的性能。
  • 當針對一個表的刪除操作很多時,表會產生大量碎片。刪除操作釋放的空間不會被插入操作立即重用,甚至永遠也不會被重用,這被稱之為高水位問題;

如何檢查表是否有高水位問題?

  1. 收集表的統計信息
SQL> exec dbms_stats.gather_table_stats(ownname=>‘SCHEMA_NAME‘,tabname=> ‘TABLE_NAME‘);
  1. 查詢高水位表信息
/* 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;
  1. 查看上次收集的統計時間
select table_name,last_analyzed from dba_tables where owner = ‘SCHEMA_NAME‘
  1. 收集整個 Schema 中對象的統計信息
SQL> exec dbms_stats.gather_schema_stats(ownname=>‘SCHEMA_NAME‘);

高水位問題會產生什麽不好的影響?

  • 查詢響應時間(尤其是全表掃描)變慢
  • 產生大量行遷移
  • 浪費空間

如何解決高水位問題?

10g之前有兩種方式

  1. 導出表,刪除表,再導入表
  2. 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執行的兩個階段:

  1. 數據重組(compact):通過一系列insert、delete操作,將數據盡量排列在段的前面。在這個過程中需要在表上加RX鎖,即只在需要移動的行上加鎖。由於涉及到rowid的改變,需要enable row movement.同時要disable基於rowid的trigger.這一過程對業務影響比較小。
  2. HWM調整:第二階段是調整HWM位置,釋放空閑數據塊。此過程需要在表上加X鎖,會造成表上的所有DML語句阻塞。在業務特別繁忙的系統上可能造成比較大的影響。
  • 註意:shrink space語句兩個階段都執行。shrink space compact只執行第一個階段。如果系統業務比較繁忙,可以先執行shrink space compact重組數據,然後在業務不忙的時候再執行shrink space降低HWM釋放空閑數據塊。

Oracle 高水位問題