본문 바로가기
IT/AWR-ASH

ASH 데이터를 활용한 애플리케이션 성능 분석: 특정 애플리케이션이 사용하는 SQL 성능 분석.

by free-inf 2025. 2. 18.

서버 이관 프로젝트를 진행하는 과정에서 애플리케이션의 성능을 유지하는 것은 매우 중요한 과제다. 데이터베이스 성능 저하는 애플리케이션의 응답 속도와 사용자 경험에 직접적인 영향을 미칠 수 있으며, 성능이 저하되면 트랜잭션 처리 속도가 느려지고, 시스템 부하가 증가하여 전체적인 운영 효율성이 떨어질 수 있다.

 

특히, 애플리케이션이 데이터베이스와 상호작용하는 방식(즉, 실행하는 SQL 쿼리, 트랜잭션 처리, 세션 유지 방식 등)은 애플리케이션의 성능을 결정짓는 주요 요소 중 하나다. 만약 애플리케이션에서 실행하는 SQL이 비효율적으로 작성되었거나, 인덱스를 제대로 활용하지 못하는 경우, 불필요한 디스크 I/O가 발생하고 실행 속도가 느려질 가능성이 높다.

 

이러한 문제를 효과적으로 분석하고 해결하기 위해 Oracle ASH(Active Session History) 데이터를 활용하여 애플리케이션에서 실행하는 SQL의 성능을 실시간으로 모니터링하고, 병목 현상을 감지하는 것이 중요하다. ASH 데이터는 초 단위로 활성 세션 정보를 기록하여 특정 애플리케이션이 실행하는 SQL을 추적하고 성능 문제를 분석하는 데 유용하게 활용할 수 있다.

 

본 글에서는 ASH 데이터를 활용하여 특정 애플리케이션이 실행하는 SQL의 성능을 분석하는 방법과, 이를 최적화하는 전략을 상세히 설명한다. 이를 통해 서버 이관 후 애플리케이션의 성능을 유지하고, 데이터베이스 운영을 효율적으로 관리할 수 있도록 한다.


ASH 데이터를 활용한 애플리케이션 성능 분석의 필요성

특정 애플리케이션의 SQL 실행 패턴 분석

  • 애플리케이션이 데이터베이스와 상호작용하는 방식은 실행하는 SQL 쿼리의 패턴과 효율성에 의해 결정된다.
  • 특정 애플리케이션에서 실행하는 SQL이 과도한 리소스를 사용하는 경우, 다른 애플리케이션에도 영향을 미칠 수 있다.
  • ASH 데이터를 활용하면 특정 애플리케이션이 실행하는 SQL을 식별하고, 실행 빈도 및 성능을 분석할 수 있다.

CPU 및 디스크 I/O 사용량 모니터링

  • 애플리케이션에서 실행하는 SQL이 과도한 CPU를 사용하거나 불필요한 디스크 I/O를 초래하는 경우, 성능 저하가 발생할 가능성이 높다.
  • ASH 데이터를 활용하면 CPU 사용률이 높은 SQL과 I/O 부하를 유발하는 SQL을 추적할 수 있다.

대기 이벤트(WAIT EVENT) 분석

  • 애플리케이션이 실행하는 SQL이 어떤 대기 이벤트로 인해 지연되는지 분석하면, 성능 문제를 해결하는 데 도움이 된다.
  • 특정 SQL이 데이터 락(Lock), 디스크 I/O, 네트워크 대기 등의 이유로 지연되는 경우, ASH 데이터를 활용하여 이를 신속하게 감지하고 해결할 수 있다.

비효율적인 SQL 튜닝 및 실행 계획 최적화

  • 애플리케이션이 사용하는 SQL이 풀 테이블 스캔(Full Table Scan)을 수행하거나, 적절한 인덱스를 활용하지 못하는 경우, 실행 속도가 급격히 느려질 수 있다.
  • ASH 데이터를 활용하면 비효율적인 SQL을 식별하고, 실행 계획을 최적화하여 성능을 개선할 수 있다.

ASH 데이터를 활용한 애플리케이션 SQL 성능 분석 방법

1. 특정 애플리케이션이 실행하는 SQL 조회

특정 애플리케이션이 실행하는 SQL을 분석하려면 ASH 데이터를 활용하여 해당 애플리케이션이 실행한 SQL을 조회할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS execution_count 
FROM 
  v$active_session_history 
WHERE 
  module = '애플리케이션_이름' 
  AND sample_time >= SYSDATE - (30 / 1440) -- 최근 30분간 조회
GROUP BY 
  sql_id 
ORDER BY 
  execution_count DESC;
  • module → 애플리케이션 이름을 기반으로 SQL을 필터링.
  • execution_count → 해당 애플리케이션에서 실행된 SQL 횟수.

이 데이터를 활용하면 특정 애플리케이션이 어떤 SQL을 가장 많이 실행하는지 분석할 수 있으며, 실행 빈도가 높은 SQL을 최적화할 수 있다.


2. 특정 애플리케이션의 CPU 사용량 분석

애플리케이션이 실행하는 SQL 중 CPU 사용량이 높은 SQL을 분석하려면 다음 SQL을 실행할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS cpu_usage 
FROM 
  v$active_session_history 
WHERE 
  module = '애플리케이션_이름' 
  AND session_state = 'ON CPU' 
  AND sample_time >= SYSDATE - (30 / 1440) -- 최근 30분간 조회 
GROUP BY sql_id ORDER BY cpu_usage DESC;
  • cpu_usage → 해당 SQL이 CPU에서 실행된 횟수.

이 데이터를 활용하면 특정 SQL이 과도한 CPU 부하를 유발하는지 확인할 수 있으며, 실행 계획을 최적화하여 CPU 사용량을 줄일 수 있다.


3. 특정 애플리케이션의 디스크 I/O 부하 분석

애플리케이션이 실행하는 SQL 중 디스크 I/O 부하가 높은 SQL을 분석하려면 다음 SQL을 실행할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS io_waits 
FROM 
  v$active_session_history 
WHERE 
  module = '애플리케이션_이름' 
  AND wait_class = 'User I/O' 
  AND sample_time >= SYSDATE - (30 / 1440) -- 최근 30분간 조회 
GROUP BY sql_id ORDER BY io_waits DESC;
 
  • io_waits → 특정 SQL이 디스크 I/O 대기로 인해 지연된 횟수.

이 데이터를 활용하면 디스크 I/O 부하를 유발하는 SQL을 식별하고, 적절한 인덱스 추가 및 실행 계획 최적화를 통해 성능을 개선할 수 있다.


4. 특정 애플리케이션의 대기 이벤트 분석

애플리케이션이 실행하는 SQL이 어떤 대기 이벤트로 인해 지연되는지 분석하려면 다음 SQL을 실행할 수 있다.

SELECT 
  event, 
  COUNT(*) AS wait_count 
FROM 
  v$active_session_history 
WHERE 
  module = '애플리케이션_이름' 
  AND session_state = 'WAITING' 
  AND sample_time >= SYSDATE - (30 / 1440) 
GROUP BY 
  event 
ORDER BY 
  wait_count DESC;
  • event → 특정 SQL이 대기한 이벤트.
  • wait_count → 해당 이벤트가 발생한 횟수.

이 데이터를 활용하면 애플리케이션의 성능이 특정 대기 이벤트로 인해 저하되는지를 분석하고, 이를 최적화할 수 있다.


애플리케이션 SQL 성능 최적화를 위한 해결 방법

  1. 가장 많이 실행되는 SQL 최적화
    • 인덱스 추가 및 실행 계획 개선을 통해 SQL 실행 속도를 향상.
    • SQL 튜닝을 통해 불필요한 풀 테이블 스캔(Full Table Scan) 제거.
  2. CPU 부하가 높은 SQL 최적화
    • 조인 방식 변경(Nested Loop Join 활용), 병렬 처리 적용(PARALLEL 힌트 사용) 등을 고려.
  3. 디스크 I/O 부하 감소
    • 자주 조회되는 데이터는 캐싱 적용 또는 Materialized View 사용 고려.
    • 인덱스 재구성 및 테이블 파티셔닝 활용.
  4. 대기 이벤트 해결
    • 락을 최소화하도록 트랜잭션 크기 조정.
    • 네트워크 부하를 줄이기 위해 대량 데이터 전송 시 배치 처리 적용.

ASH 데이터를 활용하면 특정 애플리케이션이 실행하는 SQL을 실시간으로 분석하고, CPU 사용량, 디스크 I/O 부하, 대기 이벤트 등의 병목 현상을 효과적으로 진단할 수 있다.

 

특히, SQL 실행 패턴을 최적화하고, 인덱스를 적절히 활용하며, 애플리케이션의 트랜잭션 전략을 개선하면 성능을 크게 향상할 수 있다.