
概述
移动一张表实际上是一个重组过程,数据库会将原来的数据复制到新的地方。但是如果你发现这个表在移动后性能下降了,可能是你的索引没有重建。本文将指导您找到依赖索引并重建它们。
将表从示例移动到用户
SQL>selecttablespace_namefromdba_tableswhereowner='HR'andtable_name='EMPLOYEES';
TABLESPACE_NAME
------------------------------
EXAMPLE
SQL>altertablehr.employeesmovetablespaceusers;
Tablealtered.
SQL>selecttablespace_namefromdba_tableswhereowner='HR'andtable_name='EMPLOYEES';
TABLESPACE_NAME
------------------------------
USERS
查看哪些索引取决于此表
SQL>columnindex_nameformata30;
SQL>columntablespace_nameformata30;
SQL>columnstatusformata10;
SQL>selectindex_name, tablespace_name, statusfromdba_indexeswhereowner='HR'andtable_name='EMPLOYEES';
INDEX_NAMETABLESPACE_NAMESTATUS
----------------------------------------------------------------------
EMP_JOB_IXEXAMPLEUNUSABLE
EMP_DEPARTMENT_IXEXAMPLEUNUSABLE
EMP_MANAGER_IXEXAMPLEUNUSABLE
EMP_NAME_IXEXAMPLEUNUSABLE
EMP_EMAIL_UKEXAMPLEUNUSABLE
EMP_EMP_ID_PKEXAMPLEUNUSABLE
6rowsselected.
如您所见,所有依赖索引都是UNUSABLE。这意味着,数据库不会自动重建它们。你必须自己做。
编写所有重建语句,然后执行它们
SQL>select'alter index '||owner||'.'||index_name||' rebuild tablespace users;'asSQL_TO_BE_EXECUTEDfromdba_indexeswhereowner='HR'andtable_name='EMPLOYEES';
SQL_TO_BE_EXECUTED
--------------------------------------------------------------------------------
alterindexEMP_JOB_IXrebuildtablespaceusers;
alterindexEMP_DEPARTMENT_IXrebuildtablespaceusers;
alterindexEMP_MANAGER_IXrebuildtablespaceusers;
alterindexEMP_NAME_IXrebuildtablespaceusers;
alterindexEMP_EMAIL_UKrebuildtablespaceusers;
alterindexEMP_EMP_ID_PKrebuildtablespaceusers;
6rowsselected.
或者您可以重建原始表空间的索引。
SQL>select'alter index '||owner||'.'||index_name||' rebuild tablespace '||tablespace_name||';'asSQL_TO_BE_EXECUTEDfromdba_indexeswhereowner='HR'andtable_name='EMPLOYEES';
SQL_TO_BE_EXECUTED
--------------------------------------------------------------------------------
alterindexHR.EMP_DEPARTMENT_IXrebuildtablespaceEXAMPLE;
alterindexHR.EMP_NAME_IXrebuildtablespaceEXAMPLE;
alterindexHR.EMP_MANAGER_IXrebuildtablespaceEXAMPLE;
alterindexHR.EMP_EMP_ID_PKrebuildtablespaceEXAMPLE;
alterindexHR.EMP_EMAIL_UKrebuildtablespaceEXAMPLE;
alterindexHR.EMP_JOB_IXrebuildtablespaceEXAMPLE;
6rowsselected.
请注意,我们在新表空间USERS中重建索引。也就是说,对于索引,REBUILD相当于表中的MOVE
重建后检查状态
SQL>selectindex_name, tablespace_name, statusfromdba_indexeswhereowner='HR'andtable_name='EMPLOYEES';
INDEX_NAMETABLESPACE_NAMESTATUS
----------------------------------------------------------------------
EMP_JOB_IXUSERSVALID
EMP_DEPARTMENT_IXUSERSVALID
EMP_MANAGER_IXUSERSVALID
EMP_NAME_IXUSERSVALID
EMP_EMAIL_UKUSERSVALID
EMP_EMP_ID_PKUSERSVALID
6rowsselected.
所有索引都变为VALID,表明所重建的索引有效。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/248412.html<