1. 程式人生 > 其它 >ORACLE 表移動後必須做的事

ORACLE 表移動後必須做的事

概述

移動一張表實際上是一個重組過程,資料庫會將原來的資料複製到新的地方。但是如果你發現這個表在移動後效能下降了,可能是你的索引沒有重建。本文將指導您找到依賴索引並重建它們。

 

將表從示例移動到使用者

SQL> select tablespace_name from dba_tables where owner = 'HR' and table_name = 'EMPLOYEES';

TABLESPACE_NAME
------------------------------
EXAMPLE

SQL> alter table hr.employees move tablespace users;

Table altered.

SQL> select tablespace_name from dba_tables where owner = 'HR' and table_name = 'EMPLOYEES';

TABLESPACE_NAME
------------------------------
USERS

檢視哪些索引取決於此表

SQL> column index_name format a30;
SQL> column tablespace_name format a30;
SQL> column status format a10;
SQL> select index_name, tablespace_name, status from dba_indexes where owner = 'HR' and table_name = 'EMPLOYEES';

INDEX_NAME                     TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------
EMP_JOB_IX                     EXAMPLE                       UNUSABLE
EMP_DEPARTMENT_IX             EXAMPLE                       UNUSABLE
EMP_MANAGER_IX                 EXAMPLE                       UNUSABLE
EMP_NAME_IX                   EXAMPLE                       UNUSABLE
EMP_EMAIL_UK                   EXAMPLE                       UNUSABLE
EMP_EMP_ID_PK                 EXAMPLE                       UNUSABLE

6 rows selected.

如您所見,所有依賴索引都是UNUSABLE。這意味著,資料庫不會自動重建它們。你必須自己做

編寫所有重建語句,然後執行它們

SQL> select 'alter index ' || owner || '.' ||index_name || ' rebuild tablespace users;' as SQL_TO_BE_EXECUTED from dba_indexes where owner = 'HR' and table_name = 'EMPLOYEES';

SQL_TO_BE_EXECUTED
--------------------------------------------------------------------------------
alter index EMP_JOB_IX rebuild tablespace users;
alter index EMP_DEPARTMENT_IX rebuild tablespace users;
alter index EMP_MANAGER_IX rebuild tablespace users;
alter index EMP_NAME_IX rebuild tablespace users;
alter index EMP_EMAIL_UK rebuild tablespace users;
alter index EMP_EMP_ID_PK rebuild tablespace users;

6 rows selected.

或者您可以重建原始表空間的索引。

SQL> select 'alter index ' || owner || '.' ||index_name || ' rebuild tablespace ' || tablespace_name || ';' as SQL_TO_BE_EXECUTED from dba_indexes where owner = 'HR' and table_name = 'EMPLOYEES';

SQL_TO_BE_EXECUTED
--------------------------------------------------------------------------------
alter index HR.EMP_DEPARTMENT_IX rebuild tablespace EXAMPLE;
alter index HR.EMP_NAME_IX rebuild tablespace EXAMPLE;
alter index HR.EMP_MANAGER_IX rebuild tablespace EXAMPLE;
alter index HR.EMP_EMP_ID_PK rebuild tablespace EXAMPLE;
alter index HR.EMP_EMAIL_UK rebuild tablespace EXAMPLE;
alter index HR.EMP_JOB_IX rebuild tablespace EXAMPLE;

6 rows selected.

請注意,我們在新表空間USERS中重建索引。也就是說,對於索引,REBUILD相當於表中的MOVE

重建後檢查狀態

SQL> select index_name, tablespace_name, status from dba_indexes where owner = 'HR' and table_name = 'EMPLOYEES';

INDEX_NAME                     TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------
EMP_JOB_IX                     USERS                         VALID
EMP_DEPARTMENT_IX             USERS                         VALID
EMP_MANAGER_IX                 USERS                         VALID
EMP_NAME_IX                   USERS                         VALID
EMP_EMAIL_UK                   USERS                         VALID
EMP_EMP_ID_PK                 USERS                         VALID

6 rows selected.

所有索引都變為VALID,表明所重建的索引有效。