ある表領域に作成した表と索引を別の表領域に移動する方法です。
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を参照するようになりました。
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を参照するようになりました。
コメント