oracle索引失效批解決辦法
阿新 • • 發佈:2018-12-10
專案中伺服器操作過後,資料庫中所有表的索引都失效了,每個都重新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;
感謝我的朋友建森教給我新的解決辦法。