sourcetip

Oracle에서 모든 테이블 인덱스 사용 안 함 및 나중에 사용 안 함

fileupload 2023. 6. 12. 21:51
반응형

Oracle에서 모든 테이블 인덱스 사용 안 함 및 나중에 사용 안 함

Oracle에서 지정된 스키마/데이터베이스의 모든 인덱스를 비활성화하고 나중에 활성화하려면 어떻게 해야 합니까?

참고: 이는 sqlldr을 더 빠르게 실행하기 위한 것입니다.

다음은 파일 없이 인덱스를 사용할 수 없도록 만드는 것입니다.

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;

재구축도 이와 유사합니다.

3개의 답변을 함께 결합: (선택 문은 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 SESSION" 대신 "ALTER SYSTEM"을 사용해야 합니다(그리고 매개 변수를 찾은 방식으로 다시 배치해야 합니다).

출처: 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];

Oracle에서 제약 조건을 비활성화할 수 있지만 인덱스는 비활성화할 수 없습니다.인덱스를 사용할 수 없도록 설정하는 명령이 있지만 인덱스를 다시 작성해야 하므로 인덱스를 삭제하고 다시 작성하는 스크립트를 작성해야 합니다.user_indexes 및 user_ind_columns를 사용하여 스키마의 모든 인덱스를 가져오거나 dbms_metadata를 사용할 수 있습니다.

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

병렬이 아닌 직접 경로 로드를 사용하는 경우 특히 인덱스가 소수의 열만 포함하는 경우 인덱스를 전혀 삭제하지 않는 것을 고려하고 벤치마크합니다.Oracle에는 직접 경로 로드에서 인덱스를 효율적으로 유지 관리할 수 있는 메커니즘이 있습니다.

그렇지 않으면 인덱스를 삭제하는 대신 사용할 수 없게 만드는 것이 좋습니다.실수로 인덱스를 다시 만들지 않을 가능성이 줄어듭니다.

Oracle 11g에 있는 경우 dbms_index_utl도 체크아웃할 수 있습니다.

두 가지 답변을 결합합니다.

먼저 모든 인덱스를 사용할 수 없도록 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;

sqlldr의 SKIP_INDEX_MAINTENSION 매개 변수를 사용해 보십시오.

언급URL : https://stackoverflow.com/questions/129046/disable-and-later-enable-all-table-indexes-in-oracle

반응형