Pergunta

Como eu poderia desativar e depois permitir que todos os índices em um esquema dado / banco de dados no Oracle?

Nota:. Isto é para tornar sqlldr correr mais rápido

Foi útil?

Solução

Aqui está fazendo os índices inutilizáveis ??sem o arquivo:

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;

A reconstrução seria semelhante.

Outras dicas

combinando 3 respostas juntos: (Porque uma instrução SELECT não executar o 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

Do import ...

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

Note que este assume que a importação vai acontecer na mesma sessão (sqlplus).
Se você está chamando "imp" ele será executado em uma sessão separada para que você precisaria usar "ALTER SYSTEM" em vez de "ALTER SESSION" (e lembre-se de colocar o parâmetro de volta do jeito que você achou.

Se você estiver usando não paralelos cargas caminho direto, em seguida, considerar e referência não deixar cair os índices em tudo, especialmente se os índices cobrem apenas uma minoria das colunas. A Oracle tem um mecanismo para a manutenção eficiente de índices em cargas de caminho direto.

Caso contrário, eu também aconselham fazer os índices inutilizáveis ??em vez de deixá-los cair. Menos chance de, acidentalmente, não recriando um índice.

A partir daqui: http://forums.oracle.com/forums/ thread.jspa? messageID = 2354075

alter session set skip_unusable_indexes = true;

alter index your_index unusable;

fazer importação ...

alter index your_index rebuild [online];

Você pode desativar restrições no Oracle mas não indexa. Há um comando para fazer um índice ununsable mas você tem que reconstruir o índice de qualquer forma, então eu provavelmente apenas escrever um script para descartar e recriar os índices. Você pode usar os USER_INDEXES e user_ind_columns para obter todos os índices para um esquema ou uso DBMS_METADATA:

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

Se você estiver em Oracle 11g, você pode também querer verificar para fora dbms_index_utl .

A combinação das duas respostas:

Primeiro crie SQL para fazer toda índice inutilizável:

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

Do import ...

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

Você deve tentar parâmetro SKIP_INDEX_MAINTENANCE de sqlldr.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top