1. 程式人生 > >oracle索引失效批解決辦法

oracle索引失效批解決辦法

專案中伺服器操作過後,資料庫中所有表的索引都失效了,每個都重新rebuild索引太麻煩,這裡介紹sql批處理方法。 建一個rebuild索引的儲存過程

CREATE OR REPLACE PROCEDURE REBUILD_INDEX(INPUTDT IN VARCHAR2) --僅對無效的索引操作
 AS
  SQLT VARCHAR(200);
BEGIN
  --只取非臨時索引
  FOR IDX IN (SELECT INDEX_NAME, TABLESPACE_NAME, STATUS
                FROM USER_INDEXES
               WHERE STATUS = 'UNUSABLE' ORDER BY INDEX_NAME ASC) LOOP
    --如果是如重建無效的索引,且當索引不是無效時,則跳過
    SQLT := 'alter index ' || IDX.INDEX_NAME || ' rebuild ';
    DBMS_OUTPUT.PUT_LINE(IDX.INDEX_NAME);
    EXECUTE IMMEDIATE SQLT;
    <<CONTINUE>>
    NULL;    
    END LOOP;
END REBUILD_INDEX;

或者對全表進行分析

CREATE OR REPLACE PROCEDURE ANALYZE_TABLES(INPUTDT IN VARCHAR2) 
  SQLT VARCHAR2(200);
BEGIN
    FOR TAB IN (SELECT TABLE_NAME, TABLESPACE_NAME, STATUS FROM USER_TABLES) LOOP
      SQLT := 'analyze table ' || TAB.TABLE_NAME || ' compute statistics ';
      DBMS_OUTPUT.ENABLE(buffer_size => null);--表示輸出buffer不受限制
      DBMS_OUTPUT.PUT_LINE(TAB.TABLE_NAME);
      EXECUTE IMMEDIATE SQLT;
      <<CONTINUE>>
      NULL;
    END LOOP;
END ANALYZE_TABLES;

感謝我的朋友建森教給我新的解決辦法。