이 블로그 게시물에서는 Oracle®Database에서 통계를 복원할 수 있는 시기와 방법을 살펴봅니다.
소개
데이터베이스 관리자(DBA)로서 새로운 통계를 수집하면 최적화 프로그램이 차선의 실행 계획을 실행하게 되는 경우가 종종 있습니다. 이러한 경우 성능이 더 좋았던 시점의 통계를 복원할 수 있습니다.
그러나 Oracle Database의 다른 버전에는 통계 처리 방식이 약간 변경되었습니다.
- Oracle 10g는 쉽게 복원할 수 있도록 통계를 자동으로 보존하기 시작했습니다.
- 11.1 이상에서 Oracle은 통계 게시 연기를 허용하는 더 나은 방법을 도입했습니다.
저조한 통계 실적의 가능한 이유
최적화 프로그램이 최적의 실행 계획을 선택하도록 통계를 수집해야 할 수도 있지만 통계 수집은 SQL 문의 구문 분석된 표현을 무효화합니다. 또한 통계를 수집한 후 명령문을 재분석하면 옵티마이저가 원래 계획과 다르고 덜 최적화된 실행 계획을 선택할 수 있습니다.
Oracle 10g 이상에서는 dbms_stats를 사용하여 통계를 복원할 수 있습니다. 통계를 복원하고 통계를 내보내는 옵션을 제공하는 패키지입니다.
기본적으로 Oracle은 31일 동안 기록 통계를 유지하지만 해당 기간을 변경할 수 있습니다.
다음 이미지는 현재 보존 기간을 표시하는 SQL 명령을 보여줍니다.
보존 기간을 변경하려면 다음 명령을 실행하십시오. 여기서 xx 사용하려는 일 수:
SQL> execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (xx)
다음 쿼리는 복원할 수 있는 과거 데이터 통계를 이해하는 데 도움이 됩니다.
참고: 이 예는 이전에 언급한 날짜 이후의 통계를 보여줍니다.
테이블 통계 복원
이 예는 이전 날짜의 테이블 통계를 복원하는 방법을 보여줍니다.
먼저 다음 명령을 실행하여 사용할 수 있는 통계를 식별합니다.
SQL> select TABLE_NAME, STATS_UPDATE_TIME from dba_tab_stats_history where table_name like 'MY_TABLE' and owner='MYSELF' order by 2;
TABLE_NAME STATS_UPDATE_TIME
--------------- --------------------------------------
MY_TABLE 20-DEC-19 05.32.26.887184 AM -05:00
MY_TABLE 20-DEC-19 10.10.19.361091 PM -05:00
MY_TABLE 21-DEC-19 05.32.14.475934 AM -05:00
MY_TABLE 21-DEC-19 10.10.18.725917 PM -05:00
MY_TABLE 22-DEC-19 10.10.17.841143 PM -05:00
MY_TABLE 23-DEC-19 05.32.56.168779 AM -05:00
MY_TABLE 23-DEC-19 10.10.23.633939 PM -05:00
MY_TABLE 24-DEC-19 05.32.14.082730 AM -05:00
MY_TABLE 24-DEC-19 10.10.21.712948 PM -05:00
MY_TABLE 25-DEC-19 05.32.13.710159 AM -05:00
MY_TABLE 25-DEC-19 10.10.17.836929 PM -05:00
MY_TABLE 26-DEC-19 05.32.14.545533 AM -05:00
MY_TABLE 26-DEC-19 10.10.12.808687 PM -05:00
MY_TABLE 27-DEC-19 05.32.13.779967 AM -05:00
MY_TABLE 지난 며칠 동안 여러 번 분석되었습니다.21-DEC-19 10.10.18.725917 PM -05:00에 수집된 테이블의 테이블 통계를 복원하려면 , 다음 명령을 실행하십시오:
SQL> execute dbms_stats.restore_table_stats('MYSELF','MY_TABLE','21-DEC-19 10.10.18.725917 PM -05:00');
PL/SQL procedure successfully completed.
스키마 통계 복원
이 예는 이전 날짜의 스키마 통계를 복원하는 방법을 보여줍니다.
21-DEC-19 10.10.18.725917 PM -05:00에 수집된 테이블의 스키마 통계를 복원하려면 , 다음 명령을 실행하십시오:
SQL> exec dbms_stats.restore_schema_stats(ownname=>'MYSELF', AS_OF_TIMESTAMP=>'21-DEC-19 10.10.18.725917 PM -05:00');
AS_OF_TIMESTAMP에 대해 사용 가능한 스키마 통계 옵션을 찾으려면 , 다음 명령을 실행하고 적절한 복원 날짜를 선택하십시오.
select count(*), stats_update_time from dba_tab_stats_history where owner='MYSELF'group by stats_update_time;
기타 통계 복원
테이블 및 스키마 통계를 복원하는 방법을 살펴보았습니다. 다음 목록은 이전 통계를 복원할 수 있는 모든 항목을 보여줍니다.
- TABLE_STATS
- SCHEMA_STATS
- DATABASE_STATS
- DICTIONARY_STATS
- FIXED_OBJECTS_STATS
- SYSTEM_STATS
저장하려는 통계 내보내기
다음 단계를 수행하여 변경하기 전에 저장하려는 통계를 내보내거나 현재 통계를 내보낼 수도 있습니다.
-
다음 예와 유사한 명령을 실행하여 통계 테이블을 생성합니다.
Exec dbms_stats.create_stat_table(자신의 이름 => 'MYSELF', stattab => 'MYSELF_STATS_
',tblspace => ' ');
소유 이름: 소유자 이름stattab: tblspace:를 만들 사용자 MYSELF 아래의 테이블 이름 이 테이블을 생성할 테이블스페이스
다음 예와 유사한 명령을 실행하여 이전 표의 통계를 내보냅니다.
exec dbms_stats.export_table_stats('SCHEMA1','TAB1',NULL,'STATS','TAG1_TAB1',TRUE);
예:
Exec dbms_stats.export_database_stats(statown => 'MYSELF', stattab => 'MYSELF_STATS');
결론
이 게시물의 정보와 쿼리는 모든 유형의 데이터베이스 통계(테이블, 데이터베이스, 스키마, Fixed_Object, 시스템 및 사전)를 합리적인 과거 날짜로 복원하여 원활한 데이터베이스 성능을 보장하는 데 도움이 됩니다.
피드백 탭을 사용하여 의견을 작성하거나 질문하십시오. 지금 채팅을 시작하여 대화를 시작할 수도 있습니다.
데이터베이스 서비스에 대해 자세히 알아보기