禁用并在以后启用Oracle中的所有表索引?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我将如何禁用并在以后启用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;

重建也会类似。

用户回答回答于

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”(并记住按照找到的方式重新放置参数。

扫码关注云+社区