Пересобираем индексы после массового удаления данных.
- Сначала нужно проверить ведётся и у вас сбор статистики оптимизатора автоматически. Если нет, то запустить её в ручную.
- Проверяем есть ли возможность пересобрать индексы online
alter index "MY_SCHEMA"."MY_INDEX" rebuild online
*
ERROR at line 1:
ORA-00439: feature not enabled: Online Index Build
Эта ошибка говорит, что у вас нет такой возможности.
- Можно проверить какая у вас версия oracle database.
COL PRODUCT FORMAT A35
COL VERSION FORMAT A15
COL STATUS FORMAT A15
SELECT * FROM PRODUCT_COMPONENT_VERSION;
Если у вас нет «oracle database enterprise edition», то значит у вас «oracle database standart edition» и опция online не доступна.
- Можно так же сразу пересобрать все индексы в несколько таблицах (‘MY_TABLE_ONE’,’MY_TABLE_TWO’)
set serveroutput on;
declare
type table_varchar is table of varchar2(50);
var_table_varchar table_varchar;
begin
var_table_varchar := table_varchar('MY_TABLE_ONE','MY_TABLE_TWO');
for elem in 1 .. var_table_varchar.count loop
dbms_output.put_line('TABLE '||elem||'.'||var_table_varchar(elem)||' ');
FOR cur IN (select INDEX_NAME, OWNER from dba_indexes where table_name=var_table_varchar(elem) and index_type='NORMAL')
LOOP
dbms_output.put_line('ALTER INDEX "'||cur.INDEX_NAME||'" REBUILD');
EXECUTE IMMEDIATE 'ALTER INDEX "'||cur.OWNER||'"."'||cur.INDEX_NAME||'" REBUILD';
END LOOP;
end loop;
end;
/
Если у вас очень большая таблица, то можно отключить на время логирование и распараллелить процесс.
alter index my_idx rebuild parallel 63 nologging;
alter index my_idx noparallel;
alter index my_idx logging;