検証10g新機能 その2
<検証10g新機能 その2 ~セグメント縮小編~>
ペンネーム:グリーンペペ
前回に引き続き10g新機能shrinkコマンドの検証です。
◆環境
Linux 2.4.9-e.24enterprise
Oracle10g EE Release 10.1.0.2.0
◆alter table xxx shrink space VS. alter table xxx move
◇その3.空き領域がなくても実行可能
moveコマンドは、
移行元セグメントから、移行先セグメントへデータを移動させるコマンドです。
よって、移行先セグメント用領域を新規に確保する必要があります。
@@MOVEコマンドの場合@@
SQL> alter table emp move; ORA-01652: unable to extend temp segment by 8 in tablespace AUTOSEG_TST
AUTOSEG_TST表領域に空き領域が足りないようです。
SQL> select f.tablespace_name,d.file_name,f.bytes/1024 KBytes,f.blocks,d.autoextensible from dba_free_space f,dba_data_files d,dba_tables t where f.tablespace_name = d.tablespace_name and f.tablespace_name = t.tablespace_name and t.owner='SCOTT' and t.table_name='EMP'; TABLESPACE_NAME FILE_NAME KBYTES BLOCKS AUTOEXT --------------- ---------------------------------------- ------- ------- ------- AUTOSEG_TST /export/home/ora10g/oradata/AUTOSEG1.DBF 64 8 NO
@@SHRINKコマンドの場合@@
以上のような殆ど空き領域がない表領域に格納されているオブジェクトでも
shrinkコマンドは実行可能です。
SQL> alter table emp shrink space; Table altered.
◇その4.indexの再構築の必要がない
@@MOVEコマンドの場合@@
tableにindexが貼られていた場合、moveコマンドだとindexを再作成する必要
があります。
SQL> alter table dept move; Table altered. SQL> select owner,index_name,status from dba_indexes where table_owner='SCOTT' and table_name='DEPT'; OWNER INDEX_NAME STATUS ----- ---------- -------- SCOTT PK_DEPT UNUSABLE ←(indexは使用不可) SQL> select /*+ index(dept pk_dept) */ * from dept where rownum=1; ORA-01502: index 'SCOTT.PK_DEPT' or partition of such index is in unusable state
moveコマンドの実行後、indexが使用不可になっているため、indexにての検索
が行えなくなっています。
これを解消しindexを使用可能とするにはindexをrebuildする必要があります。
SQL> alter index pk_dept rebuild; Index altered. SQL> select /*+ index(dept pk_dept) */ * from dept where rownum=1; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK
@@SHRINKコマンドの場合@@
shrinkコマンド実行時にはこのようなindexのrebuild作業は必要ありません。
SQL> alter table dept shrink space; Table altered. SQL> select /*+ index(dept pk_dept) */ * from dept where rownum=1; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK SQL> select owner,index_name,status from dba_indexes where table_owner='SCOTT' and table_name='DEPT'; OWNER INDEX_NAME STATUS ----- ---------- -------- SCOTT PK_DEPT VALID ←(indexは使用可能)
◇その5.cascadeオプション
先ほどのshrinkコマンドにてdept表は縮小されましたが、関連するpk_deptイ
ンデックスも同時に縮小してしまうのがcascadeコマンドです。
@@SHIRNKコマンド ~オプションなし~ @@
–dept表shrink前
SQL> select owner,segment_name,bytes,blocks,extents from dba_segments where segment_name = 'PK_DEPT'; OWNER SEGMENT_NAME BYTES BLOCKS EXTENTS ----- ------------ ---------- ---------- ---------- SCOTT PK_DEPT 18874368 2304 33 SQL> alter table dept shrink space; Table altered.
–dept表shrink後
SQL> select owner,segment_name,bytes,blocks,extents from dba_segments where segment_name = 'PK_DEPT'; OWNER SEGMENT_NAME BYTES BLOCKS EXTENTS ----- ------------ ---------- ---------- ---------- SCOTT PK_DEPT 18874368 2304 33
関連するpk_deptインデックスは縮小されていません。
@@SHIRNKコマンド ~cascadeオプション~ @@
–dept表shrink前
SQL> select owner,segment_name,bytes,blocks,extents from dba_segments where segment_name = 'PK_DEPT'; OWNER SEGMENT_NAME BYTES BLOCKS EXTENTS ----- ------------ ---------- ---------- ---------- SCOTT PK_DEPT 18874368 2304 33 SQL> alter table dept shrink space cascade; Table altered.
–dept表shrink後
SQL> select owner,segment_name,bytes,blocks,extents from dba_segments where segment_name = 'PK_DEPT'; OWNER SEGMENT_NAME BYTES BLOCKS EXTENTS ----- ------------ ---------- ---------- ---------- SCOTT PK_DEPT 65536 8 1
関連するpk_deptインデックスが縮小されていることが窺えます。
◆まとめ
さて10g新機能であるshrinkコマンドについて検証を2回に渡ってお送りしまし
た。shrinkコマンドの長所ばかり取り上げてきたので制限事項についても付記
いたします。
1.行移行の解消は不可
2.ローカル管理の自動セグメント管理でないとできない
3.以下のセグメントは対象外
-クラスタ、クラスタ化表
-long列を含むオブジェクト
-LOBセグメント
-ファンクションインデックスを含むテーブル
また、弊社での検証環境ではmoveコマンドの方が実行時間が短い結果となりま
した。やはり、ケースによって使い分けていく方法がよろしいのではないかと
思います。
それでは、また会う日まで。アディオス!!
五月晴れの茅ヶ崎より