oracleで、インデックスを違う表領域に移動したくなった場合

oracle使っててインデックスを作るときに、入れる表領域を指定しないと、そのユーザのdefault tablespaceに作られてしまう。user_segmentsなんかを見てインデックス用の表領域に入ってないことに気づい(て青ざめ)た時にこういうのを打つ。(USER_IDX表領域に持っていきたい場合)

alter index index_name rebuild tablespace USER_INDX

というのを、インデックスの数だけ打てばよい。で、インデックスの数だけ出すにはsqlplus上でこうする。

set lin 1000
set trims off
set feed off
set pages 0
spool idx_move.sql
select 'alter index ' || name || ' rebuild tablespace USER_INDX;' from user_objects
where object_type = 'INDEX'
;
spool off
ed idx_move.sql -- SQL>を取り除いたり。内容確認 

SQL>という表記を取りたければ、set sqlprompt '' という方法もあるにはあるんだが、)
納得の行く出来であれば(主キーなんかも一緒に移動用スクリプトに含まれるからそれで良いのかの確認をしてから)実行する。

@idx_move.sql