source

Oracle이 모든 테이블의 통계를 수동으로 업데이트

factcode 2023. 6. 28. 22:00
반응형

Oracle이 모든 테이블의 통계를 수동으로 업데이트

소유자와 상관없이 모든 테이블에 대한 모든 통계를 업데이트할 수 있는 방법이 있습니까?

이 스니플렛을 찾았지만, 이것이 모든 테이블을 잡을 수 있을지 확신할 수 없습니다.

BEGIN
   FOR A IN ( SELECT owner FROM SYS.all_tables ) LOOP
      execute immediate
        EXEC dbms_stats.gather_schema_stats( 'A.owner', cascade='TRUE');
   END LOOP;
END;

DBMS_STATS.GATER_DATABASE_STATS 사용:

begin
    dbms_stats.gather_database_stats;
end;
/

한 번에 하나의 스키마만 수행할 수 있는 패키지는 없습니다.

아래 스크립트를 사용하여 모든 스키마의 모든 개체 유형에 대한 통계를 수집할 수 있습니다.나열한 항목에는 몇 가지 문제가 있습니다('A.owner'는 문자열이지만 개체여야 함 등).

에서 건너뛸 스키마를 추가할 수 있습니다.IN기본 제공 스키마에 대해 이 작업을 수행하지 않으려는 경우 목록을 표시합니다(어쨌든 대부분 정적이므로 낭비가 될 수 있습니다).또한 통계를 수집하는 각 스키마에 대해 적절한 권한이 있어야 합니다(또는 DBA로 로그인해야 함).

모든 개체에 대한 통계 수집(아마도 실제로 원하는 것):

BEGIN
    FOR rec IN (SELECT * 
                FROM all_users
                WHERE username NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_schema_stats(rec.username);
    END LOOP;
END;

테이블에서만 통계 수집:

BEGIN
    FOR rec IN (SELECT * 
                FROM all_tables
                WHERE owner NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_table_stats(rec.owner, rec.table_name);
    END LOOP;
END;

나는 잠긴 통계와 IOT 테이블을 예외를 통과하는 것처럼 건너뛸 수 있도록 @sehrop 절차를 수정했습니다.

BEGIN
    FOR rec IN (SELECT a.owner, a.table_name 
                FROM all_tables a, dba_tab_statistics  s
                WHERE a.owner NOT IN ('SYS','SYSDBA')
                AND 
                (a.iot_type IS NULL
                OR
                a.iot_type != 'IOT_OVERFLOW')
                and a.owner = s.owner and a.table_name = s.table_name and s.STATTYPE_LOCKED is null)
    LOOP
        dbms_stats.gather_table_stats(rec.owner, rec.table_name);
    END LOOP;
END;

언급URL : https://stackoverflow.com/questions/16380732/oracle-manually-update-statistics-on-all-tables

반응형