Как отключить и позже включить все индексы в данной схеме/базе данных в Oracle?
Примечание. Это означает, что sqlldr будет работать быстрее.
Как отключить и позже включить все индексы в данной схеме/базе данных в Oracle?
Примечание. Это означает, что sqlldr будет работать быстрее.
Здесь делается невозможным использование индексов без файла:
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;
Перестройка будет аналогичной.
объединение трех ответов вместе: (поскольку оператор 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;
сделать импорт...
alter index your_index rebuild [online];
Вы можете отключить ограничения в Oracle, но не индексы. Там команда сделать индекс неустранимым, но вам все равно нужно перестроить индекс, поэтому я, вероятно, просто напишу script, чтобы отбросить и перестроить индексы. Вы можете использовать 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;
Вы должны попробовать sqlldr параметр SKIP_INDEX_MAINTENANCE.