Отключить, а затем включить все табличные индексы в Oracle - PullRequest
19 голосов
/ 24 сентября 2008

Как отключить, а затем включить все индексы в данной схеме / базе данных в Oracle?

Примечание. Это ускоряет работу sqlldr.

Ответы [ 8 ]

18 голосов
/ 20 августа 2010

Вот как индексы невозможно использовать без файла:

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;

Восстановление было бы похоже на

6 голосов
/ 26 сентября 2008

объединение 3 ответов вместе: (поскольку оператор выбора не выполняет 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

Делать импорт ...

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

Обратите внимание, что предполагается, что импорт будет происходить в том же сеансе (sqlplus).
Если вы вызываете «imp», он будет запущен в отдельном сеансе, поэтому вам нужно будет использовать «ALTER SYSTEM» вместо «ALTER SESSION» (и не забудьте вернуть параметр так, как вы его нашли.

3 голосов
/ 25 сентября 2008

Если вы используете непараллельную прямую загрузку пути, тогда учитывайте и измеряйте, как вообще не отбрасывать индексы, особенно если индексы охватывают только меньшинство столбцов. В Oracle есть механизм для эффективного обслуживания индексов при прямых загрузках.

В противном случае, я бы также посоветовал сделать индексы непригодными для использования вместо их удаления. Меньше шансов случайно не воссоздать индекс.

2 голосов
/ 31 августа 2009

Если вы используете Oracle 11g, вы также можете проверить dbms_index_utl .

2 голосов
/ 24 сентября 2008

Вы можете отключить ограничения в Oracle, но не индексы. Есть команда, чтобы сделать индекс неиспользуемым, но вы все равно должны перестроить индекс, так что я бы, вероятно, просто написал скрипт для удаления и перестроения индексов. Вы можете использовать user_indexes и user_ind_columns для получения всех индексов для схемы или использовать dbms_metadata:

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
2 голосов
/ 24 сентября 2008

Отсюда: http://forums.oracle.com/forums/thread.jspa?messageID=2354075

alter session set skip_unusable_indexes = true;

alter index your_index unusable;

сделать импорт ...

alter index your_index rebuild [online];

1 голос
/ 24 сентября 2008

Сочетание двух ответов:

Сначала создайте sql, чтобы сделать весь индекс непригодным для использования:

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

Делать импорт ...

select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u;
0 голосов
/ 16 октября 2009

Вы должны попробовать параметр SKIP_INDEX_MAINTENANCE в sqlldr.

...