Отключить и позже включить все табличные индексы в Oracle
Как отключить и позже включить все индексы в данной схеме / базе данных в Oracle?
Примечание: это сделать sqlldr работать быстрее.
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;
перестройка будет аналогичной.
объединение 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 " (и не забудьте вернуть параметр так, как вы его нашли.
Если вы используете непараллельные прямые нагрузки пути, то рассмотрите и бенчмарк, не отбрасывая индексы вообще, особенно если индексы охватывают только меньшинство столбцов. Oracle имеет механизм эффективного обслуживания индексов при прямых нагрузках пути.
в противном случае я бы также посоветовал сделать индексы непригодными для использования вместо их удаления. Меньше шансов случайно не воссоздать индекс.
отсюда:http://forums.oracle.com/forums/thread.jspa?messageID=2354075
alter session set skip_unusable_indexes = true;
alter index your_index unusable;
do импорт...
alter index your_index rebuild [online];
вы можете отключить ограничения в Oracle, но не индексирует. Есть команда, чтобы сделать индекс неуправляемым, но вы все равно должны перестроить индекс, поэтому я, вероятно, просто напишу сценарий для удаления и перестроения индексов. Вы можете использовать user_indexes и user_ind_columns, чтобы получить все индексы для схемы или использовать dbms_metadata:
select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
Если вы находитесь на Oracle 11g, вы также можете проверить dbms_index_utl.
объединение двух ответов:
сначала создайте 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;