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

StackOverflow https://stackoverflow.com/questions/129046

  •  02-07-2019
  •  | 
  •  

Вопрос

Как мне отключить, а затем включить все индексы в данной схеме/базе данных в 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;

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

Другие советы

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

Если вы используете непараллельную загрузку по прямому пути, рассмотрите возможность и проверьте, не удаляя ли индексы вообще, особенно если индексы охватывают только меньшинство столбцов.В 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, но не индексы.Есть команда, делающая индекс неработоспособным, но вам все равно придется перестроить индекс, поэтому я, вероятно, просто напишу сценарий для удаления и перестроения индексов.Вы можете использовать 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;

Вам следует попробовать параметр SKIP_INDEX_MAINTENANCE sqlldr.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top