検証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コマンドの検証を行います。
今週はココマデ。
衣替えのシーズンの茅ヶ崎より