Deshabilitar y luego habilitar todos los índices de tabla en Oracle

¿Cómo desactivo y luego habilito todos los índices en un esquema / database dado en Oracle?

Nota: Esto es para hacer que sqlldr funcione más rápido.

Esto hace que los índices sean inutilizables sin el file:

DECLARE CURSOR usr_idxs IS select * from user_indexes; cur_idx usr_idxs% ROWTYPE; v_sql VARCHAR2(1024); BEGIN OPEN usr_idxs; LOOP FETCH usr_idxs INTO cur_idx; EXIT WHEN NOT usr_idxs%FOUND; v_sql:= 'ALTER INDEX ' || cur_idx.index_name || ' UNUSABLE'; EXECUTE IMMEDIATE v_sql; END LOOP; CLOSE usr_idxs; END; 

La reconstrucción sería similar.

combinando 3 respuestas juntas: (porque una statement de selección no ejecuta el DDL)

 set pagesize 0 alter session set skip_unusable_indexes = true; spool c:\temp\disable_indexes.sql select 'alter index ' || u.index_name || ' unusable;' from user_indexes u; spool off @c:\temp\disable_indexes.sql 

Importa …

 select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u; 

Tenga en count que esto supone que la import va a suceder en la misma session (sqlplus).
Si llama a "imp", se ejecutará en una session separada por lo que necesitaría usar "ALTER SYSTEM" en lugar de "ALTER SESSION" (y recuerde volver a poner el parámetro como lo encontró).

Si está utilizando cargas de ruta directa no paralelas, considere y haga una testing de reference para no descartar los índices, particularmente si los índices solo cubren una minoría de las columnas. Oracle tiene un mecanismo para el mantenimiento eficiente de los índices en las cargas de ruta directa.

De lo contrario, también recomendaría hacer los índices inutilizables en lugar de descartarlos. Menos posibilidades de no recrear accidentalmente un índice.

Desde aquí: http://forums.oracle.com/forums/thread.jspa?messageID=2354075

alter session set skip_unusable_indexes = true;

alter index your_index unusable;

Importar …

alter index your_index rebuild [online];

Puede deshabilitar restricciones en Oracle pero no índices. Hay un command para hacer que un índice no se pueda usar, pero hay que rebuild el índice de todos modos, así que probablemente solo escriba un script para descartar y rebuild los índices. Puede usar user_indexes y user_ind_columns para get todos los índices para un esquema o usar dbms_metadata:

 select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u; 

Si tiene Oracle 11g, también puede consultar dbms_index_utl .

Combinando las dos respuestas:

Primero crea sql para hacer que todo el índice sea inutilizable:

 alter session set skip_unusable_indexes = true; select 'alter index ' || u.index_name || ' unusable;' from user_indexes u; 

Importa …

 select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u; 

Debería probar el parámetro SKIP_INDEX_MAINTENANCE de sqlldr.