트러블슈팅 오라클 퍼포먼스 2판 (2017년)
DBMS_HPROF 0 0 22,569

by 구루비스터디 DBMS_PROFILER DBMS_HPROF PLSHPROF [2023.09.08]


DBMS_HPROFDBMS_PROFILER
계층형 프로파일러(권장)라인 레벨 프로파일러
활성화 시 매우 작은 오버헤드
호출 레벨의 정보 제공
Self time 과 Total time 개념 모두 지원
추가 권한 불필요
네이티브 컴파일 된 PL/SQL 지원
라인 레벨 정보 제공
11.1 이전 버전에서 사용 가능
모든 주요 개발도구에서 지원


DBMS_HPROF

  • 세션 레벨에서 계층형 프로파일러 제공
    • 호출이 실행된 총 횟수
    • 호출을 처리하는 데 소모한 시간
    • 서브 호출을 처리하는 데 소모한 시간
    • 호출 계층에 대한 정보


  • 대상 : 사용자 실행 가능 모든 PL/SQL 코드 (wrapped PL/SQL 은 최상위 레벨 정보만 수집됨)
  • 출력 : 트레이스 파일 → 테이블 적재 or PLSHPROF 유틸리티 적용


테이블내용
DBMSHP_RUNS프로파일링 세션 정보
DBMSHP_FUNCTION_INFO수행된 서브프로그램 목록
DBMSHP_PARENT_CHILD_INFO호출 하는/당하는 프로그램 간 관계


출력 테이블 설치하기

  • DBMS_HPROF 는 사용자 권한 수행
    • dbmshptab.sql 수행 후 SYNONYM & GRANT 처리
    • 사용자 계정에 테이블 생성


프로파일링 데이터 수집

  • dbms_hprof.start_profiling : 프로파일러 활성화
파라미터정보
location트레이스 파일이 저장 될 오라클 디렉터리 오브젝트 이름
filename트레이스 파일 이름 (존재 시 덮어씀)
max_depth데이터 수집 호출 깊이 (NULL: 무제한)


  • dbms_hprof.stop_profiling : 프로파일링 비활성화
  • dbms_hprof.analyze : 출력테이블 저장



BEGIN
  dbms_hprof.start_profiling(location => 'PLSHPROF_DIR',
                             filename => 'dbms_hprof.trc');
END;
/

SET TIMING ON
DECLARE
  l_count INTEGER;
BEGIN
  perfect_triangles(1000);
  SELECT count(*) INTO l_count
  FROM all_objects;
END;
/

BEGIN
  dbms_hprof.stop_profiling;
END;
/

SELECT dbms_hprof.analyze(location => 'PLSHPROF_DIR',
                          filename => 'dbms_hprof.trc') AS runid
FROM dual;


프로파일링 데이터를 수동으로 리포팅하기

  • 네임스페이스 별로 나눔

SELECT sum(function_elapsed_time)/1000 AS total_ms,
       100*ratio_to_report(sum(function_elapsed_time)) over () AS total_percent,
       sum(calls) AS calls,
       100*ratio_to_report(sum(calls)) over () AS calls_percent,
       namespace AS namespace_name
FROM dbmshp_function_info
WHERE runid = &runid
GROUP BY namespace
ORDER BY total_ms DESC;

TOTAL [ms]   TOT%  CALLS   CAL% NAMESPACE_NAME
---------- ------ ------- ----- --------------
      565	54.9%	  89    5.6 SQL
      464	45.1%   1494   94.4 PLSQL

  • 모듈 별로 나눔 (p.128)

SELECT sum(function_elapsed_time)/1000 AS total_ms,
       100*ratio_to_report(sum(function_elapsed_time)) over () AS total_percent,
       sum(calls) AS calls,
       100*ratio_to_report(sum(calls)) over () AS calls_percent,
       namespace,
       nvl(nullif(owner || '.' || module, '.'), function) AS module_name,
       type
FROM dbmshp_function_info
WHERE runid = &runid
GROUP BY namespace, nvl(nullif(owner || '.' || module, '.'), function), type
ORDER BY total_ms DESC;


  • 계층 구조에 따라 표시 (p.129)

SELECT lpad(' ', (level-1) * 2) || nullif(c.owner || '.', '.') ||
       CASE WHEN c.module = c.function THEN c.function ELSE nullif(c.module || '.', '.') || c.function END AS function_name,
       pc.subtree_elapsed_time/1000 AS total_ms,
       pc.function_elapsed_time/1000 AS function_ms,
       pc.calls AS calls
FROM dbmshp_parent_child_info pc,
     dbmshp_function_info p,
     dbmshp_function_info c
START WITH pc.runid = &runid
AND p.runid = pc.runid
AND c.runid = pc.runid
AND pc.childsymid = c.symbolid
AND pc.parentsymid = p.symbolid
AND p.symbolid = 1
CONNECT BY pc.runid = prior pc.runid
AND p.runid = pc.runid
AND c.runid = pc.runid
AND pc.childsymid = c.symbolid
AND pc.parentsymid = p.symbolid
AND prior pc.childsymid = pc.parentsymid
ORDER SIBLINGS BY total_ms DESC;


PLSHPROF 사용하기


$ plshprof -output dbms_hprof dbms_hprof.trc
-- 두개 트레이스 파일 지정 시 둘 사이 값의 차이(Delta) 표시


  • 결과물(dbms_hprof.html)
    • 8개의 서로 다른 기준에 따라 정렬된 함수별 경과시간 데이터
    • 3개의 서로 다룬 기준에 따라 정렬된 모듈별 경과시간 데이터
    • 3개의 서로 다른 기준에 따라 정렬된 네임스페이스별 경과시간 데이터
    • 부모와 자식의 경과시간 데이터


GUI 사용하기

  • SQL Developer
  • Dell Toad


"데이터베이스 스터디모임" 에서 2017년에 "전문가를 위한 트러블슈팅 오라클 퍼포먼스(Second Edition) " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4326

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입