En muchas ocasiones necesitamos mover o cambiar índices de un Tablespace a otro, las razones pueden ser múltiples, índices que se han creado en un Tablespace erróneo, para tareas de tuning, etc. realmente no vamos a mover o cambiar un índice con haríamos con una tabla sino que vamos a recrearlo en el Tablespace que deseemos, para realizar el movimiento de índices entre Tablespaces usaremos la instrucción ALTER INDEX con la cláusula REBUILD.
ALTER INDEX nombre_indice REBUILD TABLESPACE nombre_tablespace;
Por ejemplo para mover un índice desde el Tablespace actual al Tablespace DATOS1_IDX lo haremos así.
SQL>ALTER INDEX VENTAS.CLIENTES_IDX1 REBUILD TABLESPACE DATOS1_IDX;
Sencillo verdad, si queremos mover todos los índices de una tabla ¿Como lo podemos hacer?
Bien vamos a preparar una DDL (Data Definition Language) para que no tengamos que realizar el ALTER de cada uno de los índices de nuestra tabla.
Tenemos que mover todos los índices de la tabla VENTAS.CLIENTES al Tablespace DATOS1_IDX, pues bien desde SQLPLUS y como usuario SYS tecleamos las siguientes instrucciones:
SQL>SET HEAD OFF
SQL>SET LINE 200
SQL>SET PAGESIZE 3000
SQL>SET FEED OFF
SQL>spool mover_indices_VENTAS_CLIENTES.ddl
SQL>SELECT 'ALTER INDEX VENTAS.'||index_name||' REBUILD TABLESPACE DATOS1_IDX;'
FROM DBA_INDEXES
WHERE OWNER = 'VENTAS'
AND TABLE_NAME = 'CLIENTES';
SQL>spool off
Con este bloque de instrucciones hemos generado el fichero mover_indices_VENTAS_CLIENTES.ddl que contiene todas las instrucciones ALTER para todos los dices de la tabla VENTAS.CLIENTES, vamos a editar el fichero generado antes de procesarlo por que tenemos que eliminar algunas líneas que nos sobran, dado que hemos generado un fichero de texto utilizaremos el vi si estáis en Linux/Unix y si por el contrario estáis trabajando en Windows os recomiendo el editor free PSPAD (Descargar desde aquí), excelente, nuestra DDL contendrá algo parecido a esto.
SQL> SELECT 'ALTER INDEX VENTAS.'||table_name||' REBUILD TABLESPACE DATOS1_IDX;'
FROM DBA_INDEXES
WHERE OWNER = 'VENTAS'
AND TABLE_NAME = 'CLIENTES';
ALTER INDEX VENTAS.CLIENTES_IDX1 TABLESPACE DATOS1_IDX;
ALTER INDEX VENTAS.CLIENTES_IDX2 REBUILD TABLESPACE DATOS1_IDX;
SQL> spool off
Borramos las tres líneas de la sentencia SELECT y al final la línea spool off, salvamos el fichero y desde sqlplus lo procesamos, desde sqlplus y como usuario SYS ejecutamos la DDL mover_indices_VENTAS_CLIENTES.ddl.
SQL>@mover_indices_VENTAS_CLIENTES.ddl
Si todo ha ido bien tendremos todos los índices de la VENTAS.CLIENTES en el Tablespace DATOS1_IDX.