禁用并稍后在Oracle中启用所有表索引

时间:2008-09-24 18:48:02

标签: sql oracle sql-loader

如何在Oracle中禁用并稍后启用给定模式/数据库中的所有索引?

注意:这是为了让sqlldr运行得更快。

8 个答案:

答案 0 :(得分:18)

如果没有文件,这里的索引就无法使用:

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;

重建将类似。

答案 1 :(得分:6)

将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”(并记住将参数放回原来的位置。

答案 2 :(得分:3)

如果您正在使用非并行直接路径加载,那么请考虑并基准测试不要丢弃索引,特别是如果索引仅覆盖少数列。 Oracle有一种在直接路径负载上有效维护索引的机制。

否则,我还建议使索引不可用而不是丢弃它们。不太可能不会重新创建索引。

答案 3 :(得分:2)

从这里开始: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];

答案 4 :(得分:2)

您可以在Oracle中禁用约束,但不能禁用索引。有一个命令使索引不可用,但你必须重建索引,所以我可能只是写一个脚本来删除和重建索引。您可以使用user_indexes和user_ind_columns获取模式的所有索引或使用dbms_metadata:

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;

答案 5 :(得分:2)

如果您使用的是Oracle 11g,则可能还需要查看dbms_index_utl

答案 6 :(得分:1)

结合两个答案:

首先创建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;

答案 7 :(得分:0)

您应该尝试使用sqlldr的SKIP_INDEX_MAINTENANCE参数。