본문 바로가기
IT/AWR-ASH

ASH 데이터를 활용한 성능 추세 분석: 일정 기간 동안 성능 변화 감지 및 튜닝.

by free-inf 2025. 2. 10.

서버 이관 프로젝트를 수행하는 과정에서 가장 중요한 목표 중 하나는 데이터베이스 성능을 안정적으로 유지하고 최적화하는 것이다. 기존 서버와 새로운 환경 간의 차이로 인해 예상치 못한 성능 변화가 발생할 가능성이 높으며, 특정 시간대에 성능이 저하되거나 특정 SQL이 시스템에 부담을 주는 패턴이 나타날 수 있다.

 

이러한 문제를 사전에 감지하고 대응하기 위해서는 일정 기간 동안의 성능 데이터를 수집하고 분석하는 것이 필수적이다. Oracle 데이터베이스의 ASH(Active Session History) 데이터를 활용하면 시간에 따른 성능 변화를 추적하고 성능 저하의 주요 원인을 분석할 수 있으며, 이를 바탕으로 데이터베이스 튜닝을 수행할 수 있다.

 

본 글에서는 ASH 데이터를 활용하여 일정 기간 동안 성능 변화를 감지하는 방법과 이를 기반으로 튜닝을 수행하는 방법을 설명한다. 이를 통해 서버 이관 후 예상치 못한 성능 문제를 해결하고, 데이터베이스 성능을 최적화할 수 있도록 한다.

1. ASH 데이터를 활용한 성능 추세 분석의 필요성

1.1 성능 추세 분석이 중요한 이유

서버 이관 후, 데이터베이스의 성능이 일관되게 유지되는지 여부를 확인하는 것이 중요하다. 특정 시간대에 성능이 저하되거나, 특정 SQL이 반복적으로 성능 문제를 일으키는 경우, 이를 조기에 감지하고 대응하지 않으면 시스템 전체가 불안정해질 수 있다.

성능 추세 분석을 수행하면 다음과 같은 문제를 해결할 수 있다.

  • CPU, 메모리, 디스크 I/O 사용량 변화 감지
  • 특정 시간대에 성능이 저하되는 패턴 분석
  • 자주 실행되는 SQL 및 문제를 일으키는 SQL 식별
  • 대기 이벤트(Wait Event) 증가 추세 분석 및 해결
  • 락(Lock) 및 블로킹 세션 증가 여부 감지

ASH 데이터를 일정 기간 동안 수집하고 분석하면, 성능 저하의 원인을 정확히 파악할 수 있으며, 데이터베이스 튜닝을 통해 안정적인 성능을 유지할 수 있다.


2. ASH 데이터를 활용한 성능 추세 분석 방법

2.1 특정 기간 동안의 CPU 사용량 변화 분석

서버 이관 후 CPU 사용 패턴이 변경되었는지 확인하려면 ASH 데이터를 활용하여 시간별 CPU 사용량을 분석해야 한다.

 
SELECT 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ) AS time_slot, 
  COUNT(*) AS cpu_usage 
FROM 
  v$active_session_history 
WHERE 
  session_state = 'ON CPU' 
  AND sample_time BETWEEN TO_DATE(
    '2024-02-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'
  ) 
  AND TO_DATE(
    '2024-02-07 23:59:59', 'YYYY-MM-DD HH24:MI:SS'
  ) 
GROUP BY 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ) 
ORDER BY 
  time_slot;
  • session_state = 'ON CPU': 실행 중인 세션만 필터링.
  • time_slot: 시간 단위로 CPU 사용량을 집계.

이 데이터를 활용하면 어떤 시간대에 CPU 사용량이 급증하는지 파악할 수 있으며, 피크 시간에 실행되는 SQL을 분석하여 튜닝할 수 있다.


2.2 특정 SQL의 실행 패턴 분석

특정 SQL이 일정 기간 동안 어떤 패턴으로 실행되었는지 분석하면, 비효율적인 SQL을 찾아 성능 최적화를 수행할 수 있다.

 
SELECT 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ) AS time_slot, 
  sql_id, 
  COUNT(*) AS execution_count 
FROM 
  v$active_session_history 
WHERE 
  sample_time BETWEEN TO_DATE(
    '2024-02-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'
  ) 
  AND TO_DATE(
    '2024-02-07 23:59:59', 'YYYY-MM-DD HH24:MI:SS'
  ) 
GROUP BY 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ), 
  sql_id 
ORDER BY 
  execution_count DESC;
  • sql_id: 실행된 SQL의 고유 ID.
  • execution_count: 특정 시간 동안 SQL이 실행된 횟수.

이 데이터를 분석하면 자주 실행되는 SQL을 확인하고 실행 계획을 최적화하여 성능을 개선할 수 있다.


2.3 대기 이벤트(Wait Event) 증가 패턴 분석

대기 이벤트는 SQL 실행 속도 저하의 주요 원인 중 하나이므로, 일정 기간 동안 특정 대기 이벤트가 증가하는지 분석하는 것이 중요하다.

SELECT 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ) AS time_slot, 
  event, 
  COUNT(*) AS wait_count 
FROM 
  v$active_session_history 
WHERE 
  sample_time BETWEEN TO_DATE(
    '2024-02-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'
  ) 
  AND TO_DATE(
    '2024-02-07 23:59:59', 'YYYY-MM-DD HH24:MI:SS'
  ) 
GROUP BY 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ), 
  event 
ORDER BY 
  wait_count DESC;
 
  • event: 특정 시간 동안 가장 많이 발생한 대기 이벤트.
  • wait_count: 해당 이벤트가 발생한 횟수.

이 데이터를 분석하면, CPU, I/O, 네트워크 대기 중 어떤 요소가 가장 큰 영향을 미치는지 파악할 수 있으며, 대기 시간이 긴 SQL을 우선적으로 최적화할 수 있다.


2.4 블로킹 세션 증가 추세 분석

블로킹 세션이 증가하면 트랜잭션이 지연되면서 전체 성능이 저하될 수 있으므로, 일정 기간 동안 블로킹 세션이 증가하는지를 분석해야 한다.

 
SELECT 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ) AS time_slot, 
  COUNT(*) AS blocking_sessions 
FROM 
  v$active_session_history 
WHERE 
  blocking_session IS NOT NULL 
  AND sample_time BETWEEN TO_DATE(
    '2024-02-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'
  ) 
  AND TO_DATE(
    '2024-02-07 23:59:59', 'YYYY-MM-DD HH24:MI:SS'
  ) 
GROUP BY 
  TO_CHAR(
    sample_time, 'YYYY-MM-DD HH24:MI'
  ) 
ORDER BY 
  time_slot;
  • blocking_session IS NOT NULL: 다른 세션을 차단하는 블로킹 세션만 조회.
  • blocking_sessions: 특정 시간 동안 블로킹 세션 발생 횟수.

이 데이터를 활용하면, 트랜잭션 크기를 조정하거나 인덱스를 최적화하여 블로킹을 최소화할 수 있다.


 

ASH 데이터를 활용한 성능 추세 분석은 일정 기간 동안 데이터베이스 성능 변화를 감지하고 최적화하는 중요한 과정이다.

특정 시간 동안 CPU 사용량, SQL 실행 빈도, 대기 이벤트, 블로킹 세션 등을 분석하면, 성능 저하 패턴을 파악할 수 있으며, 이를 기반으로 인덱스 최적화, 실행 계획 변경, 트랜잭션 조정 등의 튜닝 작업을 수행할 수 있다.