Подтвердить что ты не робот

Отключить и позже включить все табличные индексы в Oracle

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

Примечание. Это означает, что sqlldr будет работать быстрее.

4b9b3361

Ответ 1

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

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;

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

Ответ 2

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

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Объединяя два ответа:

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

Ответ 8

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