20

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

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

4

8 回答 8

20

如果没有文件,这会使索引无法使用:

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;

重建将是相似的。

于 2010-08-19T20:40:36.493 回答
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”(并记住将参数放回您找到它的方式。

于 2008-09-25T22:32:05.537 回答
4

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

于 2008-09-24T19:03:44.750 回答
3

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

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
于 2008-09-24T19:13:06.320 回答
3

如果您使用的是非并行直接路径加载,则考虑并基准测试根本不删除索引,特别是如果索引仅覆盖少数列。Oracle 有一种机制可以有效维护直接路径负载上的索引。

否则,我还建议使索引不可用而不是删除它们。意外不重新创建索引的可能性较小。

于 2008-09-24T20:47:32.333 回答
2

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

于 2009-08-31T14:54:12.287 回答
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;
于 2008-09-24T19:27:13.273 回答
0

您应该尝试 sqlldr 的 SKIP_INDEX_MAINTENANCE 参数。

于 2009-10-16T15:12:04.893 回答