Отключите, а затем включите все индексы таблиц в Oracle.
-
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.