목표 설정 및 벤치마킹의 중요성
성능 테스트는 단순히 시스템이 ‘잘’ 작동하는지 확인하는 것을 넘어, 구체적인 목표 성능 지표를 달성하는지 검증하는 과정입니다. 성능 테스트를 시작하기 전에 반드시 다음 사항들을 명확히 정의해야 합니다:
- 응답 시간 목표: 각 트랜잭션 또는 쿼리에 대한 허용 가능한 최대 응답 시간.
- 처리량 목표: 특정 시간 동안 시스템이 처리할 수 있는 트랜잭션 또는 사용자 요청의 수.
- 자원 사용률 목표: CPU, 메모리, 디스크 I/O와 같은 시스템 자원의 허용 가능한 최대 사용률.
- 동시 사용자 목표: 시스템이 지원해야 하는 동시 사용자 수.
초기 성능 기준선(Baseline)을 설정하는 것은 매우 중요합니다. 초기 기준선은 현재 시스템의 성능을 측정하고 미래의 변경 사항이 성능에 미치는 영향을 평가하기 위한 참조점으로 사용됩니다. 벤치마킹은 실제 운영 환경과 유사한 환경에서 특정 워크로드를 실행하여 초기 성능을 측정하는 프로세스입니다.
예시: 온라인 쇼핑몰
온라인 쇼핑몰의 성능 목표는 다음과 같이 설정할 수 있습니다:
- 상품 검색 응답 시간: 2초 이내
- 장바구니 추가 응답 시간: 1초 이내
- 결제 완료 응답 시간: 3초 이내
- 최대 동시 사용자 수: 1,000명
이러한 목표를 기준으로 벤치마크 테스트를 수행하여 초기 성능을 측정하고, 튜닝 후 성능 개선을 확인할 수 있습니다.
Oracle 데이터베이스 성능 테스트 도구 활용
Oracle 데이터베이스는 다양한 성능 테스트 및 모니터링 도구를 제공합니다. 이러한 도구를 효과적으로 활용하면 성능 문제를 진단하고 해결하는 데 큰 도움이 됩니다:
- SQL Trace 및 TKPROF: 개별 SQL 문의 성능을 분석하는 데 사용됩니다. SQL Trace를 활성화하면 데이터베이스는 각 SQL 문의 실행 통계(CPU 시간, 디스크 I/O 등)를 기록합니다. TKPROF 도구를 사용하여 이 추적 파일을 읽기 쉬운 형식으로 변환할 수 있습니다.
- Automatic Workload Repository (AWR): 데이터베이스의 전반적인 성능 통계를 수집하고 유지 관리합니다. AWR 보고서는 데이터베이스의 주요 성능 지표(응답 시간, 처리량, 자원 사용률 등)를 보여주며, 성능 병목 현상을 식별하는 데 도움이 됩니다.
- Automatic Database Diagnostic Monitor (ADDM): AWR 데이터를 분석하여 잠재적인 성능 문제를 자동으로 진단하고 해결 방안을 제시합니다.
- SQL Tuning Advisor: 성능이 낮은 SQL 문을 식별하고, 인덱스 생성, SQL 문 재작성, SQL 프로필 생성과 같은 튜닝 권장 사항을 제공합니다.
- SQL Access Advisor: 인덱스, 구체화된 뷰, 파티션과 같은 액세스 구조를 추천하여 쿼리 성능을 향상시킵니다.
- Performance Hub: 실시간 및 과거 데이터베이스 활동을 모니터링하고 진단하는 데 사용할 수 있는 웹 기반 인터페이스를 제공합니다.
SQL Trace 및 TKPROF 활용 상세 가이드
SQL Trace는 특정 세션 또는 전체 인스턴스에 대해 SQL 문의 실행 정보를 수집하는 강력한 도구입니다. TKPROF는 SQL Trace 파일의 내용을 사람이 읽을 수 있는 형식으로 변환하여 성능 분석을 용이하게 합니다.
- SQL Trace 활성화 (세션 레벨):
EXEC DBMS_SESSION.SET_SQL_TRACE (sql_trace => TRUE);
- SQL 문 실행: 성능을 분석하려는 SQL 문을 실행합니다.
- SQL Trace 비활성화 (세션 레벨):
EXEC DBMS_SESSION.SET_SQL_TRACE (sql_trace => FALSE);
- Trace 파일 찾기: trace 파일은 일반적으로 데이터베이스 서버의 ‘user_dump_dest’ 디렉터리에 저장됩니다. 다음과 같은 쿼리를 사용하여 위치를 확인할 수 있습니다.
SHOW PARAMETER user_dump_dest;
- TKPROF 실행: TKPROF를 사용하여 trace 파일을 분석하고 읽기 쉬운 형식으로 변환합니다.
tkprof [trace 파일 이름] [출력 파일 이름] explain=[username]/[password] sort=[정렬 옵션]
예시:
tkprof ora_12345.trc output.txt explain=scott/tiger sort=prsela,execla,fchela
여기서 ‘scott’은 데이터베이스 사용자 이름이고 ‘tiger’는 비밀번호입니다. ‘sort’ 옵션은 TKPROF 출력을 정렬하는 데 사용됩니다. 유용한 정렬 옵션은 다음과 같습니다.
- prsela: 구문 분석 경과 시간
- execla: 실행 경과 시간
- fchela: Fetch 경과 시간
- prscpu: 구문 분석 CPU 시간
- execpu: 실행 CPU 시간
- fchcpu: Fetch CPU 시간
- disk: 디스크 읽기 횟수
- query: 버퍼 가져오기 횟수
- rows: 처리된 행 수
- 결과 분석: TKPROF 출력 파일은 SQL 문 실행에 소요된 시간, CPU 사용량, 디스크 I/O, 메모리 사용량 등 다양한 성능 통계를 제공합니다. 이 정보를 사용하여 성능 병목 현상을 식별하고 튜닝 방안을 결정할 수 있습니다.
TKPROF 출력 예시
SQL 문:
SELECT *
FROM employees
WHERE department_id = :b1
통계:
call count cpu elapsed disk query current rows
------- ------ -------- ---------- --------- ------- ------- ------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.01 0.01 0 4 0 107
------- ------ -------- ---------- --------- ------- ------- ------
total 4 0.01 0.01 0 4 0 107
개요, 이 SQL 문은 구문 분석에 0.00초, 실행에 0.00초, Fetch에 0.01초 소요되었습니다. 디스크 I/O는 발생하지 않았고, 버퍼 가져오기는 4번 발생했습니다.
이 예에서, 대부분의 시간이 Fetch 단계에 소요되었음을 알 수 있습니다. 이는 데이터베이스가 데이터를 검색하는 데 시간이 오래 걸린다는 것을 의미할 수 있으며, 인덱스 또는 쿼리 최적화를 통해 개선할 수 있습니다.
AWR 보고서 생성 및 분석
AWR 보고서는 데이터베이스의 전반적인 성능을 파악하는 데 유용한 정보를 제공합니다. AWR 보고서를 생성하려면 ‘DBMS_WORKLOAD_REPOSITORY’ 패키지를 사용합니다.
- 스냅샷 ID 확인: 먼저 AWR 보고서를 생성할 스냅샷 ID 범위를 확인해야 합니다. ‘DBA_HIST_SNAPSHOT’ 뷰를 쿼리하여 사용 가능한 스냅샷 ID를 확인할 수 있습니다.
SELECT snap_id, begin_interval_time, end_interval_time
FROM dba_hist_snapshot
ORDER BY snap_id;
- AWR 보고서 생성: ‘DBMS_WORKLOAD_REPOSITORY.CREATE_REPORT’ 함수를 사용하여 AWR 보고서를 생성합니다.
SET long 1000000;
SET pagesize 0;
SET linesize 200;
SET trimspool on
SET heading off
spool awr_report.txt
SELECT dbms_workload_repository.create_report(
dbid => (SELECT dbid FROM v$database),
inst_num => (SELECT instance_number FROM v$instance),
begin_snap => [시작 스냅샷 ID],
end_snap => [종료 스냅샷 ID])
FROM dual;
spool off;
AWR 보고서 분석: 주요 섹션
- 보고서 요약 (Report Summary): 데이터베이스의 전반적인 상태와 관련된 주요 지표(DB 시간, 평균 활성 세션 등)를 제공합니다.
- 5가지 주요 시간대 이벤트 (Top 5 Timed Events): 데이터베이스가 시간을 소비한 주요 대기 이벤트를 보여줍니다. 이 섹션을 통해 성능 병목 현상을 빠르게 식별할 수 있습니다.
- 인스턴스 효율성 비율 (Instance Efficiency Percentages): 데이터베이스의 캐시 효율성(버퍼 캐시 적중률, 라이브러리 캐시 적중률 등)을 보여줍니다. 낮은 캐시 적중률은 메모리 부족 또는 비효율적인 SQL 문을 나타낼 수 있습니다.
- 로드 프로필 (Load Profile): 시간당 트랜잭션 수, SQL 문 실행 수, 사용자 콜 수 등 데이터베이스의 작업 부하를 보여줍니다.
- SQL 통계 (SQL Statistics): CPU 시간, 디스크 읽기, 실행 횟수 등 다양한 기준에 따라 정렬된 주요 SQL 문 목록을 제공합니다. 이 섹션을 통해 성능이 낮은 SQL 문을 식별하고 튜닝할 수 있습니다.
- 대기 이벤트 (Wait Events): 데이터베이스 세션이 대기한 이벤트를 보여줍니다. 과도한 대기 시간은 자원 경합 또는 비효율적인 SQL 문을 나타낼 수 있습니다.
실질적인 성능 개선 전략
성능 테스트 도구 분석 결과를 바탕으로 다음과 같은 실질적인 성능 개선 전략을 적용할 수 있습니다:
- SQL 문 튜닝: SQL Tuning Advisor 또는 TKPROF를 사용하여 성능이 낮은 SQL 문을 식별하고 튜닝합니다. 인덱스 생성, SQL 문 재작성, SQL 프로필 적용 등의 방법을 사용할 수 있습니다.
- 인덱스 최적화: SQL Access Advisor를 사용하여 필요한 인덱스를 식별하고 생성합니다. 불필요한 인덱스는 제거하여 유지 관리 오버헤드를 줄입니다.
- 메모리 튜닝: 버퍼 캐시, 공유 풀, PGA 등 데이터베이스 메모리 영역의 크기를 적절하게 조정하여 캐시 적중률을 높입니다.
- I/O 최적화: 디스크 I/O 병목 현상을 식별하고, 데이터 파일을 디스크에 분산하거나, 더 빠른 스토리지로 데이터를 이동합니다.
- 병렬 처리 활용: 병렬 쿼리 기능을 사용하여 대용량 데이터에 대한 쿼리 성능을 향상시킵니다.
- 구체화된 뷰 활용: 구체화된 뷰를 사용하여 복잡한 쿼리의 결과를 미리 계산하여 저장하고, 쿼리 재작성을 통해 쿼리 성능을 향상시킵니다.
- 파티셔닝: 테이블을 파티셔닝하여 쿼리 성능을 향상시키고, 데이터 관리를 용이하게 합니다.
- 바인드 변수 활용: SQL 문에 리터럴 값 대신 바인드 변수를 사용하여 구문 분석 오버헤드를 줄이고, SQL 주입 공격을 방지합니다.
결론
성능 테스트는 Oracle 데이터베이스 기반 애플리케이션의 성공적인 배포 및 운영에 필수적인 과정입니다. 구체적인 성능 목표 설정, 다양한 성능 테스트 도구 활용, 그리고 분석 결과를 바탕으로 한 실질적인 성능 개선 전략 적용을 통해 데이터베이스 성능을 극대화할 수 있습니다.
이 가이드라인이 Oracle 데이터베이스 성능 테스트에 대한 이해를 높이고, 실제 환경에 적용하는 데 도움이 되기를 바랍니다.