Pregunta

¿Cómo deshabilitaría y luego habilitaría todos los índices en un esquema / base de datos en Oracle?

Nota: Esto es para que sqlldr se ejecute más rápido.

¿Fue útil?

Solución

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

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.

Otros consejos

combinando 3 respuestas juntas: (porque una instrucción select 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

Importar ...

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

Tenga en cuenta que esto supone que la importación se realizará en la misma sesión (sqlplus).
Si está llamando a "imp" se ejecutará en una sesión separada, por lo que deberá 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 la posibilidad de dejar de lado los índices, en particular si los índices solo cubren una minoría de las columnas. Oracle tiene un mecanismo para el mantenimiento eficiente de índices en cargas de ruta directa.

De lo contrario, también recomendaría inutilizar los índices 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 inusable;

importar ...

alter index your_index rebuild [en línea];

Puede deshabilitar las restricciones en Oracle pero no los índices. Hay un comando para hacer que un índice no se pueda utilizar, pero de todos modos hay que reconstruir el índice, por lo que probablemente solo escribiría un script para eliminar y reconstruir los índices. Puede usar user_indexes y user_ind_columns para obtener todos los índices para un esquema o usar dbms_metadata:

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

Si está en Oracle 11g, también puede consultar dbms_index_utl .

Combinando las dos respuestas:

Primero cree sql para que todos los índices sean inutilizables:

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

Importar ...

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

Debe probar el parámetro SKIP_INDEX_MAINTENANCE de sqlldr.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top