programing

Oracle 데이터베이스 통계를 얼마나 자주 실행해야 합니까?

linuxpc 2023. 7. 10. 22:08
반응형

Oracle 데이터베이스 통계를 얼마나 자주 실행해야 합니까?

Oracle 데이터베이스 통계를 얼마나 자주 실행해야 합니까?개발자 팀은 최근 2개월 반 이상 동안 생산 현장에서 통계가 실행되지 않았다는 사실을 발견했습니다.긴 시간처럼 들리지만, 저는 DBA가 아닙니다.

Oracle 11g 통계는 기본적으로 자동으로 수집되므로

Oracle Database 설치 시 두 개의 스케줄러 창이 미리 정의됩니다.

  • WEEKNIGHT_WINDOW는 매주 월요일부터 금요일까지 밤 10시에 시작하여 오전 6시에 끝납니다.
  • WEEKEND_WINDWINDOW는 토요일과 일요일을 모두 포함합니다.

통계가 마지막으로 수집된 날짜는?

SELECT owner, table_name, last_analyzed FROM all_tables ORDER BY last_analyzed DESC NULLS LAST; --Tables.
SELECT owner, index_name, last_analyzed FROM all_indexes ORDER BY last_analyzed DESC NULLS LAST; -- Indexes.

자동 통계 수집 상태?

SELECT * FROM dba_autotask_client WHERE client_name = 'auto optimizer stats collection';

Windows 그룹?

SELECT window_group_name, window_name FROM dba_scheduler_wingroup_members;

창 일람표?

SELECT window_name, start_time, duration FROM dba_autotask_schedule;

이 스키마에서 수동으로 데이터베이스 통계 수집:

EXEC dbms_stats.gather_schema_stats(ownname=>NULL, cascade=>TRUE); -- cascade=>TRUE means include Table Indexes too.

모든 스키마에서 데이터베이스 통계를 수동으로 수집합니다.

-- Probably need to CONNECT / AS SYSDBA
EXEC dbms_stats.gather_database_stats;

데이터가 "상당히" 변경될 때마다.

테이블이 한 행에서 200 행으로 이동하면 이는 중요한 변화입니다.테이블이 100,000줄에서 150,000줄로 바뀌었을 때, 그것은 그다지 중요한 변화가 아닙니다.테이블이 일반적으로 쿼리되는 X 열의 값이 모두 동일한 1000개 행에서 X 열의 값이 거의 고유한 1000개 행으로 이동하면 이는 중요한 변화입니다.

통계는 항목 수 및 상대 빈도에 대한 정보를 저장합니다. 이 정보를 사용하면 지정된 기준과 일치하는 행 수를 "추정"할 수 있습니다.추측이 틀리면 최적화 도구는 매우 차선의 쿼리 계획을 선택할 수 있습니다.

전 직장에서는 일주일에 한 번씩 통계를 조사했습니다.제 기억이 맞다면, 목요일 밤에 예약을 했고, 금요일에는 DBA가 예상치 못한 모든 것을 위해 가장 오래 실행되는 쿼리를 모니터링하는 데 매우 주의를 기울였습니다. (주로 금요일은 코드 릴리스 직후였고 트래픽이 상당히 적은 날이었기 때문에 선택되었습니다.)잘못된 쿼리를 발견하면 더 나은 쿼리 계획을 찾아 저장하여 예기치 않게 다시 변경되지 않도록 합니다. (Oracle에는 이 작업을 자동으로 수행하는 도구가 있습니다. 사용자가 최적화할 쿼리를 알려주면 실행됩니다.)

많은 조직은 잘못된 쿼리 계획이 예기치 않게 나타날 것을 우려하여 통계 실행을 피합니다.그러나 이는 일반적으로 쿼리 계획이 시간이 지남에 따라 점점 더 나빠진다는 것을 의미합니다.그리고 그들이 통계를 실행할 때, 그들은 많은 문제에 직면합니다.이러한 문제를 해결하기 위한 결과적인 경쟁은 통계 실행의 위험에 대한 그들의 두려움을 확인시켜줍니다.하지만 정기적으로 통계를 실행하고, 모니터링 도구를 사용하여 문제를 해결하면 문제가 발생할 때 두통이 적고, 동시에 발생하지 않을 것입니다.

사용 중인 Oracle 버전은 무엇입니까?Oracle 10을 참조하는 이 페이지를 확인합니다.

http://www.acs.ilstu.edu/docs/Oracle/server.101/b10752/stats.htm

다음과 같이 표시됩니다.

통계를 수집하는 방법은 Oracle이 통계를 자동으로 수집할 수 있도록 하는 것이 좋습니다.Oracle은 모든 데이터베이스 개체에 대한 통계를 자동으로 수집하고 이러한 통계를 정기적으로 예약된 유지 관리 작업에 유지 관리합니다.

Oracle이 지원하는 대규모 다중 사용자 계획 시스템을 관리할 때 DBA는 매주 통계를 수집하는 작업을 수행했습니다.또한, 통계에 영향을 미치거나 영향을 받을 수 있는 중요한 변화를 시행할 때, 우리는 상황을 파악하기 위해 주기적으로 작업을 중단하도록 강요할 것입니다.

10g 이상 버전의 오라클에서는 최적의 실행 계획을 결정하기 위해 최적화 도구에 의해 테이블과 인덱스에 대한 최신 통계가 필요합니다.얼마나 자주 통계를 수집하는지는 까다로운 결정입니다.애플리케이션, 스키마, 데이터 속도 및 비즈니스 관행에 따라 다릅니다.이전 버전의 Oracle과 역호환되는 일부 타사 앱은 새 Optimizer에서 성능이 좋지 않습니다.이러한 애플리케이션에서는 테이블에 통계가 없으므로 db가 규칙 기반 실행 계획으로 다시 이동합니다.그러나 평균적으로 Oracle은 오래된 통계가 있는 테이블에서 통계를 수집할 것을 권장합니다.테이블을 모니터하도록 설정하고 테이블의 상태를 확인한 후 오래되었는지 여부를 분석하도록 할 수 있습니다.종종 그것으로 충분하지만, 때로는 그렇지 않습니다.그것은 당신의 데이터베이스에 따라 다릅니다.데이터베이스에는 성능을 유지하기 위해 야간 통계 수집이 필요한 OLTP 테이블 세트가 있습니다.다른 표는 일주일에 한 번 분석됩니다.대규모 dw 데이터베이스에서는 테이블이 너무 커서 전체 db 로드 및 성능에 영향을 미치지 않고 정기적으로 분석할 수 없기 때문에 필요에 따라 분석합니다.따라서 정답은 애플리케이션, 데이터 변경 및 비즈니스 요구사항에 따라 달라집니다.

새로운 통계로 인해 쿼리 계획이 바람직하지 않은 변경될 위험과 오래된 통계로 인해 쿼리 계획이 변경될 수 있는 위험 사이의 균형을 유지해야 합니다.

테이블 ISSU와 열 CREATE_DATE가 있는 버그 데이터베이스가 있다고 가정해 보십시오. 열의 값은 다소 단조롭게 증가합니다.이제 이 열의 값이 2008년 1월 1일과 2008년 9월 17일 사이에 균일하게 분포되어 있음을 Oracle에 알리는 히스토그램이 있다고 가정합니다.따라서 Optimizer는 지난 주(예: 9월 7일 - 13일)에 생성된 모든 문제를 찾는 경우 반환될 행 수를 합리적으로 추정할 수 있습니다.그러나 응용 프로그램이 계속 사용되고 통계가 업데이트되지 않으면 이 히스토그램의 정확도가 점점 낮아집니다.따라서 Optimizer는 "지난 주에 생성된 문제"에 대한 쿼리가 시간이 지남에 따라 점점 더 정확하지 않을 것으로 예상하고 결국 Oracle이 쿼리 계획을 부정적으로 변경할 수 있습니다.

데이터 웨어하우스 유형 시스템의 경우 통계를 전혀 수집하지 않고 동적 샘플링(optimizer_dynamic_sampling을 레벨 2 이상으로 설정)을 사용하는 것을 고려할 수 있습니다.

일반적으로 데이터베이스에서 대량 삽입 또는 빅데이터 변경이 자주 발생하는 등 강력한 이유가 없는 한 전체 데이터베이스에서 통계를 자주 수집하지 않는 것이 좋습니다.이 빈도로 데이터베이스에 통계를 수집하면 쿼리 실행 계획이 새로운 부실 실행 계획으로 변경될 수 있습니다. 새로운 부실 계획의 영향을 받는 모든 쿼리를 조정하는 데 많은 시간이 소요될 수 있습니다. 이것이 새로운 통계 수집이 테스트 데이터베이스에 미치는 영향을 테스트해야 하는 이유입니다.또는 이를 위한 시간이나 인력이 없는 경우에는 새 통계를 수집하기 전에 원본 통계를 백업하여 예비 계획을 유지해야 합니다. 따라서 새 통계를 수집한 후 쿼리가 예상대로 수행되지 않을 경우 원래 통계를 쉽게 복원할 수 있습니다.

원래 통계를 백업하고 새 통계를 수집하는 데 도움이 되는 매우 유용한 스크립트가 있으며, 새 통계를 수집한 후 예상대로 되지 않을 경우 원래 통계를 복원하는 데 사용할 수 있는 SQL 명령을 제공합니다.다음 링크에서 스크립트를 찾을 수 있습니다. http://dba-tips.blogspot.com/2014/09/script-to-ease-gathering-statistics-on.html

언급URL : https://stackoverflow.com/questions/79229/how-often-should-oracle-database-statistics-be-run

반응형