2008年7月23日水曜日

Oracle表領域の解放(方法二)

前回、Oracle表領域の解放に対して、方法一としてのTRUNCATE方法を紹介いたしました。今回は、対象表を切り捨てなくて、HWMを下げる方法を紹介します。

概念説明:
1.HWM(High Water Mark):最高水位標
各セグメントには、HWMという、一度でもデータブロックを使用したことがあるかどうかの境を示す指標が用意されています。HWMよりも高い位置にあるブロックは未使用ブロックと判断でき、索引を使用しない表スキャン時はHWMまでのブロックを読み込みます。
HWMは、DELETE文やUPDATE文によって領域が空いたとしても下がることがなく、TRUNCATE文で表を切り捨てた場合に下がります。
HWM以下のデータブロックで領域の使用率が低い場合、表スキャンのパフォーマンスが低下する可能性があります。

2.セグメント縮小機能:
セグメント縮小機能は、2段階(圧縮と解放)で作業が行われます。
・圧縮:INSERT/DELETE文を使用した内部処理で行われ、処理中もオンライン状態となりますので、ほかのセッションで同じ表へのSELECT文、DML文の実行も可能です。でも、HWMが下がることはない。
・解放:圧縮に続いて、解放によって、HWMが引き下げられ、未使用領域が解放されます。

手順:
1.対象セグメントにある表領域は、自動セグメント領域管理であることを確認
select tablespace_name,segment_space_management
from dba_tablespaces
where tablespace_name = '対象セグメントがある表領域名';
※"AUTO"ではない場合、Oracleの設定修正が必要です。
2.行管理の有効化
・確認方法:
select row_movement from dba_tables where table_name='表名';
または
select row_movement from dba_tables
where owner='表のユーザ名' and table_name='表名';
・有効化の方法:
alter table 表名 enable row movement;
・無効化の方法:
alter table 表名 disable row movement;
3.圧縮、解放の実行
・表の圧縮のみを行う場合:
alter table 表名 shrink space compact;
・表の圧縮と解放を一緒にに行う場合:
alter table 表名 shrink space;
・表および表に依存する索引を圧縮、解放する場合:
alter table 表名 shrink space cascade;

補足説明:
・圧縮段階:
表に対して、行レベルのロックが行われる。
・解放段階:
セグメント全体のロックが行われる。また、共有プール内のカーソルが無効化されます。
====================================================================
表領域の解放作業に対して、ピーク時間帯やカーソルの無効化を避けたい場合、まず、圧縮のみを行って、オフピーク時間帯に解放を行った方がいいでしょう。

0 件のコメント: