代码之家  ›  专栏  ›  技术社区  ›  oneself

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

  •  18
  • oneself  · 技术社区  · 16 年前

    如何在Oracle中禁用并在以后启用给定架构/数据库中的所有索引?

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

    8 回复  |  直到 16 年前
        1
  •  20
  •   jmc    14 年前

    这将使索引在没有文件的情况下不可用:

    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;
    

    重建也将是类似的。

        2
  •  6
  •   pappes pappes    16 年前

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

        3
  •  4
  •   Dmitry Khalatov    16 年前

    从这里开始: 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
  •  3
  •   Brian Deterling    16 年前

    select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
    
        5
  •  3
  •   David Aldridge    16 年前

    如果您使用的是非平行的直接路径负载,那么考虑和基准根本不丢弃索引,特别是如果索引仅覆盖少数列。Oracle有一种机制可以有效地维护直接路径加载上的索引。

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

        6
  •  2
  •   Jason Baker    15 年前

    如果您使用的是Oracle 11g,您可能还想签出 dbms_index_utl .

        7
  •  1
  •   oneself    16 年前

    结合两个答案:

    首先创建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;
    
        8
  •  0
  •   Karl Bartel    15 年前

    您应该尝试sqlldr的SKIP\u INDEX\u维护参数。