Отключить, а затем включить все табличные индексы в Oracle

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

Примечание. Это сделано для того, чтобы sqldr работал быстрее.


person oneself    schedule 24.09.2008    source источник
comment
Не могли бы вы дать немного больше контекста? Например, пробовали ли вы следующие сценарии: remote-dba.net/teas_rem_util18.htm   -  person Mark Roddy    schedule 25.09.2008


Ответы (8)


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

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;

Реконструкция будет аналогичной.

person jmc    schedule 19.08.2010
comment
Не могли бы вы выложить ребилд для нубов? - person Worthy7; 18.10.2016
comment
Прошло некоторое время, но вы должны быть в состоянии просто заменить «НЕИСПОЛЬЗУЕМЫЙ» на «ВОССТАНОВИТЬ». - person jmc; 25.10.2016

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

person Community    schedule 25.09.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];

person Dmitry Khalatov    schedule 24.09.2008

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

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
person Brian Deterling    schedule 24.09.2008

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

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

person David Aldridge    schedule 24.09.2008

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

person Jason Baker    schedule 31.08.2009

Объединение двух ответов:

Сначала создайте 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;
person oneself    schedule 24.09.2008

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

person Karl Bartel    schedule 16.10.2009