如何在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个答案组合在一起:(因为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"(并记住将参数放回你找到的方式.