領域管理(セグメント縮小 SHRINK)難易度 標準無料
大量削除でハイウォーターマーク(HWM)以下に空きが散在した表 hr.bigt(自動セグメント領域管理=ASSM の表領域上)を、オンラインで縮小したい。次を実行した。
SQL> ALTER TABLE hr.bigt SHRINK SPACE; ALTER TABLE hr.bigt SHRINK SPACE * ERROR at line 1: ORA-10636: ROW MOVEMENTが使用可能ではありません
このエラーの正しい解消法を選べ。(単一選択)
- A
ALTER TABLE hr.bigt ENABLE ROW MOVEMENT;を実行してからSHRINK SPACEを再実行する - B表領域を手動セグメント領域管理(MSSM)に変更してから再実行する
- C
ALTER TABLE hr.bigt DEALLOCATE UNUSED;に置き換えればROW MOVEMENT無しで HWM 以下の空きを詰められる - D
SHRINK SPACEはNOLOGGING表でしか使えないため、表をNOLOGGINGにする
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓Gold監修
解説
ALTER TABLE ... SHRINK SPACE は、セグメント内の行を前方に詰め直して空きブロックを解放し、HWM を引き下げる操作である。
行を物理的に移動させる(rowid が変わる)ため、対象表で行移動(row movement)が有効であることが前提となる。
無効だと ORA-10636(ROW MOVEMENT is not enabled)になる。
よって ALTER TABLE hr.bigt ENABLE ROW MOVEMENT; を実行してから SHRINK SPACE を再実行すればよい。
なお SHRINK SPACE は ASSM の表領域でのみ使える(本問は ASSM で前提を満たす)。
- B逆。
SHRINK SPACEはASSM が前提。MSSM に変えたらSHRINK SPACEは使えなくなる。エラー原因も領域管理方式ではなく row movement。 - C
DEALLOCATE UNUSEDはHWM より上の未使用領域を解放するだけで、HWM 以下に散在する空きは詰められない(断片化は解消しない)。目的が違う。 - D
SHRINK SPACEとNOLOGGINGは無関係。NOLOGGING必須という制約はない。
ひっかけ:
SHRINK SPACE(HWM 以下の断片を詰める・ASSM+row movement 必須)と
DEALLOCATE UNUSED(HWM 以上の未使用を返すだけ)の混同(C)。
また ORA-10636(SHRINK)と ORA-08189(FLASHBACK TABLE)はどちらも row movement 起因だがエラー番号が異なる点に注意。✓Gold 保有者による書き下ろし解説・実機で検証済