ある表領域に作成した表と索引を別の表領域に移動する方法です。

SQL> create table TBL4 (col1 number, col2 varchar2(100));

表が作成されました。

SQL> create index TBL4_INDEX ON TBL4(col1);

索引が作成されました。

テスト用に1つの表と、その表の索引を1つ作ります。

SQL> select TABLE_NAME, TABLESPACE_NAME from USER_TABLES;

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TBL4                           TBS_BIG

SQL> select INDEX_NAME, TABLESPACE_NAME from USER_INDEXES;

INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TBL4_INDEX                     TBS_BIG


ビューより、作成した表と索引はTBS_BIGという表領域に作成されていることがわかります。

SQL> insert into TBL4 values(1,'tadashi');

1行が作成されました。

SQL> insert into TBL4 values(2,'aiai');

1行が作成されました。

SQL> insert into TBL4 values(3,'ddd');

1行が作成されました。


作成した表にデータを挿入します。

SQL> select ROWID, COL1, COL2 from TBL4;

ROWID                    COL1 COL2
------------------ ---------- --------------------
AAATJXAAAAAAACHAAA          1 tadashi
AAATJXAAAAAAACHAAB          2 aiai
AAATJXAAAAAAACHAAC          3 ddd


作成した各行のROWIDを確認しています。
このROWIDはデータファイルのデータ番号を元にして作られ、索引はそのROWIDを元にデータを参照しています。

SQL> alter table TBL4 move tablespace USERS;

表が変更されました。

SQL> select TABLE_NAME, TABLESPACE_NAME from USER_TABLES;

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TBL4                           USERS

表が属する表領域を移動しました。

SQL> select INDEX_NAME, TABLESPACE_NAME from USER_INDEXES;

INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TBL4_INDEX                     TBS_BIG

表に対して作成した索引は移動されていません。

SQL> select ROWID, COL1, COL2 from TBL4;

ROWID                    COL1 COL2
------------------ ---------- --------------------
AAATJZAAEAAAAILAAA          1 tadashi
AAATJZAAEAAAAILAAB          2 aiai
AAATJZAAEAAAAILAAC          3 ddd


再度、ROWIDを確認すると先程と変わっていることがわかります。
表領域が変わることで、データファイルも変わってしまったからです。
また索引も参照するべきROWIDが無くなってしまったので、有効では無くなってしまいました。

SQL> ALTER INDEX TBL4_INDEX REBUILD TABLESPACE users;

索引が変更されました。

SQL> select INDEX_NAME, TABLESPACE_NAME from USER_INDEXES;

INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TBL4_INDEX                     USERS


索引の属する表領域を変更しています。
変更すると同時に索引の再構築も行ないました。
これで索引は正しい表のROWIDを参照するようになりました。