본문 바로가기
IT/AWR-ASH

ASH 데이터를 이용한 특정 애플리케이션 성능 모니터링: 특정 애플리케이션에서 실행된 SQL과 리소스 사용량을 분석하는 기법.

by free-inf 2025. 3. 4.

서버 이관 프로젝트를 수행하는 과정에서 새로운 환경에서 애플리케이션 성능이 기존과 다르게 동작할 가능성이 높다. 특히, 데이터베이스와 직접 연결된 애플리케이션이 많을 경우, SQL 실행 방식이나 리소스 사용 패턴이 기존 환경과 달라질 수 있다.

 

애플리케이션이 데이터베이스에 과도한 부하를 주거나 비효율적인 SQL을 실행하면, 전체적인 시스템 성능이 저하되고 데이터 처리 속도가 느려질 수 있다. 따라서, 특정 애플리케이션이 실행하는 SQL과 리소스 사용량을 모니터링하고 최적화하는 것이 필수적이다.

 

이러한 문제를 해결하기 위해 Oracle ASH(Active Session History) 데이터를 활용하면 특정 애플리케이션이 실행한 SQL과 리소스 사용량을 실시간으로 분석할 수 있다. ASH 데이터는 세션 단위로 SQL 실행 정보를 기록하며, CPU 사용량, I/O 대기, 대기 이벤트(WAIT EVENT) 등을 확인할 수 있도록 지원한다.

 

본 글에서는 ASH 데이터를 이용하여 특정 애플리케이션에서 실행된 SQL을 모니터링하는 방법과, 이를 통해 성능을 최적화하는 기법을 상세히 설명한다. 이를 통해 서버 이관 후 예상치 못한 애플리케이션 성능 저하 문제를 신속하게 감지하고 해결할 수 있도록 한다.


특정 애플리케이션 성능을 모니터링해야 하는 이유

1. 애플리케이션에서 실행하는 SQL이 성능 저하를 유발할 가능성

  • 애플리케이션이 반복적으로 동일한 SQL을 실행하면, 데이터베이스 부하가 급격히 증가할 수 있다.
  • 잘못된 실행 계획으로 인해 불필요한 풀 테이블 스캔(Full Table Scan)이나 인덱스 미사용 문제가 발생할 가능성이 있다.

2. 애플리케이션과 데이터베이스 간의 연결(Connection) 관리 문제

  • 애플리케이션이 데이터베이스 연결(Connection)을 비효율적으로 관리하면, 세션(Session)이 과도하게 증가하여 성능 저하를 유발할 수 있다.
  • 커넥션 풀(Connection Pool) 설정이 최적화되지 않으면, 대기 시간이 증가하고 병목 현상이 발생할 가능성이 있다.

3. 애플리케이션 배포 후 예상치 못한 성능 변화 감지 필요

  • 애플리케이션 코드 변경 후 SQL 실행 방식이 달라지면서, 특정 쿼리의 실행 시간이 길어지거나 리소스 사용량이 증가할 수 있다.
  • 새로운 서버 환경에서 예상치 못한 리소스 경합(Resource Contention)이 발생할 가능성이 높다.

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

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

특정 애플리케이션이 실행한 SQL을 분석하려면 ASH 데이터를 활용하여 특정 애플리케이션의 세션(Session)에서 실행된 SQL을 조회해야 한다.

SELECT 
  sql_id, 
  COUNT(*) AS execution_count 
FROM 
  v$active_session_history 
WHERE 
  sample_time >= SYSDATE - (1) -- 최근 24시간 조회
  AND module = '애플리케이션_이름' 
GROUP BY 
  sql_id 
ORDER BY 
  execution_count DESC FETCH FIRST 10 ROWS ONLY;
  • module → 특정 애플리케이션을 식별하는 모듈(Module) 값.
  • execution_count → 해당 애플리케이션이 실행한 SQL 횟수.

이 데이터를 활용하면 특정 애플리케이션이 가장 많이 실행하는 SQL을 분석하고, 불필요한 SQL이 반복 실행되는지 확인할 수 있다.


2. 특정 애플리케이션에서 실행된 SQL의 평균 실행 시간 분석

특정 애플리케이션이 실행한 SQL 중 평균 실행 시간이 긴 SQL을 감지하려면 아래와 같이 ASH 데이터를 조회할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS execution_count, 
  AVG(elapsed_time) AS avg_execution_time 
FROM 
  v$active_session_history 
WHERE 
  sample_time >= SYSDATE - (1) -- 최근 24시간 조회
  AND module = '애플리케이션_이름' 
GROUP BY 
  sql_id 
ORDER BY 
  avg_execution_time DESC FETCH FIRST 10 ROWS ONLY;
  • avg_execution_time → 해당 SQL의 평균 실행 시간.
  • execution_count → 해당 SQL이 실행된 횟수.

이 데이터를 활용하면 특정 애플리케이션이 실행하는 SQL 중 실행 시간이 길어 성능 문제를 유발하는 SQL을 빠르게 감지할 수 있다.


3. 특정 애플리케이션의 리소스 사용량 분석

애플리케이션이 실행한 SQL이 CPU, I/O, 메모리 등 리소스를 과도하게 사용하는지 확인하려면 ASH 데이터를 활용하여 분석할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS wait_count, 
  event 
FROM 
  v$active_session_history 
WHERE 
  sample_time >= SYSDATE - (1) -- 최근 24시간 조회
  AND module = '애플리케이션_이름' 
GROUP BY 
  sql_id, 
  event 
ORDER BY 
  wait_count DESC;
  • event → 해당 SQL 실행 중 발생한 대기 이벤트.
  • wait_count → 특정 대기 이벤트가 발생한 횟수.

이 데이터를 활용하면 특정 애플리케이션이 실행하는 SQL이 CPU, 디스크 I/O, 메모리 대기 등으로 인해 지연되는지를 분석하고, 해당 문제를 해결할 수 있다.


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

1. 실행 빈도가 높은 SQL 최적화

  • 자주 실행되는 SQL을 애플리케이션 레벨에서 캐싱(Cache)하여 불필요한 실행을 줄인다.
  • 바인드 변수를 활용하여 SQL 실행 횟수를 줄이고, 커서 공유를 최적화한다.
SELECT * FROM employees WHERE department_id = :dept_id;

2. 실행 시간이 긴 SQL 튜닝

  • 인덱스를 추가하여 Full Table Scan을 방지하고, 실행 계획을 최적화한다.
  • 조인 방식 변경(Nested Loop Join 활용), 병렬 처리(PARALLEL 힌트) 등을 적용하여 실행 속도를 향상한다.
CREATE INDEX emp_dept_idx ON employees(department_id);

3. 애플리케이션의 커넥션 풀 최적화

  • 애플리케이션에서 불필요한 커넥션(Connection)이 유지되지 않도록 설정을 조정한다.
  • Oracle의 세션 풀(Session Pool)을 최적화하여 불필요한 커넥션이 지속적으로 유지되지 않도록 한다.
ALTER SYSTEM SET sessions = 500 SCOPE=SPFILE;

ASH 데이터를 활용하면 특정 애플리케이션이 실행하는 SQL을 실시간으로 추적하고 분석할 수 있다. 이를 통해 SQL 실행 빈도, 실행 시간, 리소스 사용량 등을 효과적으로 모니터링할 수 있으며, 특정 애플리케이션이 성능 저하를 유발하는 SQL을 실행하는지를 감지할 수 있다.

 

특히, 자주 실행되는 SQL을 최적화하고, 실행 시간이 긴 SQL을 튜닝하며, 커넥션 풀을 최적화하면 애플리케이션과 데이터베이스 간의 성능을 크게 개선할 수 있다.