検証10g新機能 その1

<検証10g新機能 その1 ~セグメント縮小編~>
ペンネーム:グリーンペペ

今回から10gの新機能を検証していきます。
10gの新機能といえば自動管理機能が充実しているんだよね。
えーとASMとかとか、なんて話はまた今度。
只今ワタクシは領域再編成の作業をやってましてそれに関する10gの新機能に
ついて触れていきます。

さて、皆さんはテーブルから大量delete処理などをした時にハイウォータマー
クを下げるためにはどのような処理を行いますか?

1.exp/imp
2.alter table xxx move

などになると思います。
10gでは新機能としてalter table xxx shrink spaceコマンドが実装されました。

このセグメントの縮小コマンドにより、ハイウォーターマークより下にある空
き領域を開放しハイウォーターマークを調整することが可能となりました。
サポートしているオブジェクトは以下になります。

1.テーブル
2.インデックス
3.マテリアライズド・ビュー
4.マテリアライズド・ビュー・ログ

何れも自動セグメント管理の設定をしているローカル管理表領域に格納されて
いるオブジェクトである必要があります。

では早速使ってみましょう。

◆環境
Linux 2.4.9-e.24enterprise
Oracle10g EE Release 10.1.0.2.0

◆セグメント縮小コマンドを使ってみる

SQL> select owner,segment_name,bytes,blocks,extents from dba_segments 
where segment_name = 'EMP';

OWNER SEGMENT_NAME      BYTES     BLOCKS    EXTENTS
----- ------------ ---------- ---------- ----------
SCOTT EMP            53477376       6528         66


SQL> alter table emp shrink space;

ORA-10636: ROW MOVEMENT is not enabled

※セグメントの縮小では、行移動が必要となります。よって、このコマンドを
実行するには、縮小するオブジェクトの行移動を使用可能にする必要があり
ます。

SQL> alter table emp enable row movement;

Table altered.


SQL> alter table emp shrink space;

Table altered.


SQL> select owner,segment_name,bytes,blocks,extents from dba_segments 
where segment_name = 'EMP';

OWNER SEGMENT_NAME      BYTES     BLOCKS    EXTENTS
----- ------------ ---------- ---------- ----------
SCOTT EMP               65536          8          1

なんだ、これだったらalter table xxx moveコマンドでもできるじゃないかと
いう投書がきそうですが、10g新機能は一味違います。

◆alter table xxx shrink space VS. alter table xxx move

◇その1.オンライン中に実行可能

SES1>alter table emp move;


SES2>select l.oracle_username,o.name objname,l.locked_mode from v$locked_object l,obj$ o
where l.object_id=o.obj#;

ORACLE_USERNAME                OBJNAME                        LOCKED_MODE
------------------------------ ------------------------------ -----------
SCOTT                          EMP                                      6


SES2>select rownum from scott.emp where rownum=1 for update nowait;

ORA-00054: リソース・ビジー、NOWAITが指定されていました。


SES1> alter table emp shrink space;


SES2> select l.oracle_username,o.name objname,l.locked_mode from v$locked_object l,obj$ o
      where l.object_id=o.obj#;

ORACLE_USERNAME                OBJNAME                        LOCKED_MODE
------------------------------ ------------------------------ -----------
SCOTT                          EMP                                      3


SES2>select rownum from scott.emp where rownum=1 for update nowait;

    ROWNUM
----------
         1

shrinkコマンドはmoveコマンドと違ってオブジェクトを排他ロックしません。
LOCKED_MODE列を見るとmoveコマンド実行時は’6’=排他ロックモードで実行さ
れていますが、shrinkコマンド実行時は’3’=行ロックモードで実行されてます。
よって、業務を止めることなく再編成作業を行うこともできます。
もちろんオフピーク時に作業すべきですが。

◇その2.途中でコマンドを中止しても、セグメントの縮小がされている

SCOTT.EMPをセグメント縮小する。

▽dbms_space.space_usageプロシジャーにて縮小前値導出

Segment Owner      = SCOTT
Segment Name       = EMP
Unformatted Blocks = 16
0 - 25% free blocks= 0
25- 50% free blocks= 6366
50- 75% free blocks= 0
75-100% free blocks= 36
Full Blocks        = 0

▽縮小中に強制終了

SQL> alter table emp shrink space;

ORA-00028: your session has been killed

▽強制終了直後に値導出

Segment Owner      = SCOTT
Segment Name       = EMP
Unformatted Blocks = 16
0 - 25% free blocks= 1
25- 50% free blocks= 2808
50- 75% free blocks= 0
75-100% free blocks= 1004
Full Blocks        = 2553

▽再度shrinkコマンドを実行し、正常終了した後に値導出

Segment Owner      = SCOTT
Segment Name       = EMP
Unformatted Blocks = 0
0 - 25% free blocks= 1
25- 50% free blocks= 2
50- 75% free blocks= 0
75-100% free blocks= 0
Full Blocks        = 4567

dbms_space.space_usageプロシジャーにて導出した値の推移を見てください。

1.縮小前
Full Blocksが一つもなく、ほとんどのブロックについての空きパーセンテー
ジが高いことが窺えます。

2.縮小中に強制終了
縮小が行われていることが**% free blocksが少なくなって、Full Blocksが増
えていることで窺えます。

3.縮小完了後
**% free blocksはほとんどなくなりました。
また、ブロックの総計も70%ほどに少なくなったことからハイウォーターマー
クが下げられたことが分かります。

領域の再編成は行わないといけないのは承知しているが、メンテナンスの時間
がとれないといった場合でも、何回かに分けて行うことが可能です。

どーですか?10g使ってみたくなりましたでしょうか?
来週もshrinkコマンドの検証を行います。
今週はココマデ。

衣替えのシーズンの茅ヶ崎より