본문 바로가기
IT/AWR-ASH

ASH 데이터를 활용한 트랜잭션 분석: 대량 트랜잭션이 시스템에 미치는 영향 분석.

by free-inf 2025. 2. 15.

서버 이관 프로젝트를 진행하는 과정에서 데이터베이스의 성능을 안정적으로 유지하는 것은 필수적인 과제다. 특히, 대량 트랜잭션이 발생하는 환경에서는 트랜잭션이 시스템 성능에 미치는 영향을 면밀히 분석하고 최적화하는 과정이 필요하다.

 

트랜잭션이란 데이터베이스에서 하나의 논리적인 작업 단위를 의미하며, 일반적으로 여러 SQL 연산이 하나의 트랜잭션 안에서 실행되고 Commit 또는 Rollback을 통해 완료된다. 대량 트랜잭션이 발생하면 CPU, 메모리, 디스크 I/O, 락(Lock) 대기, 블로킹 세션 등의 여러 요소에 영향을 미치며, 이러한 문제를 해결하지 않으면 시스템 성능이 저하될 수 있다.

 

이러한 상황에서 ASH(Active Session History) 데이터를 활용하면 트랜잭션 실행 중 발생하는 병목을 실시간으로 분석하고, 트랜잭션이 시스템에 미치는 영향을 평가할 수 있다. ASH 데이터는 초 단위로 활성 세션 정보를 기록하며, 이를 통해 CPU 사용량, 대기 이벤트, 트랜잭션 처리 속도, 블로킹 세션 발생 여부 등을 확인할 수 있다.

 

본 글에서는 ASH 데이터를 활용하여 대량 트랜잭션이 시스템 성능에 미치는 영향을 분석하는 방법과, 이를 최적화하는 전략을 상세히 설명한다. 이를 통해 서버 이관 후 발생할 수 있는 트랜잭션 병목을 신속하게 감지하고 해결할 수 있도록 한다.


트랜잭션이 시스템 성능에 미치는 주요 영향 요소

트랜잭션이 증가하면 시스템 자원 사용률이 급격히 증가하고, 일부 트랜잭션이 성능 병목을 일으킬 가능성이 높다. 대량 트랜잭션이 미치는 주요 영향 요소는 다음과 같다.

CPU 사용량 증가

  • 대량 트랜잭션이 발생하면 SQL 연산이 지속적으로 실행되면서 CPU 사용률이 증가할 수 있다.
  • 특정 트랜잭션이 복잡한 연산을 수행하면 CPU 사용량이 과도하게 집중되어 다른 세션의 실행이 지연될 가능성이 있다.

디스크 I/O 부하 증가

  • 트랜잭션이 데이터 읽기/쓰기 연산을 수행할 때, 디스크 I/O가 급격히 증가할 수 있다.
  • Full Table Scan이 발생하거나, 인덱스를 적절히 활용하지 못하면 불필요한 디스크 액세스가 증가하여 전체적인 성능이 저하될 수 있다.

락(Lock) 대기 및 블로킹 세션 증가

  • 여러 트랜잭션이 동시에 같은 데이터를 변경하려고 하면 락(Lock) 대기 시간이 증가하면서 블로킹 세션이 발생할 가능성이 높다.
  • 트랜잭션 크기가 너무 크면 다른 트랜잭션이 완료될 때까지 대기해야 하는 시간이 길어질 수 있다.

UNDO 및 REDO 로그 증가

  • 트랜잭션이 많아지면 UNDO(롤백 데이터)와 REDO(트랜잭션 로그) 데이터가 급격히 증가하면서 디스크 I/O 부하가 심화될 수 있다.
  • 대량의 변경 작업이 발생할 경우, UNDO와 REDO 로그가 시스템 성능 저하의 원인이 될 수 있다.

이러한 문제를 해결하기 위해서는 ASH 데이터를 활용하여 트랜잭션이 실행되는 동안 발생하는 성능 병목을 실시간으로 분석하고, 최적화하는 과정이 필요하다.


ASH 데이터를 활용한 트랜잭션 분석 방법

1. 대량 트랜잭션이 실행되는 동안 CPU 사용률 분석

대량 트랜잭션이 실행될 때 CPU를 과도하게 사용하는 SQL을 분석하려면 ASH 데이터를 활용하여 CPU 사용량이 높은 세션을 조회할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS cpu_usage 
FROM 
  v$active_session_history 
WHERE 
  session_state = 'ON CPU' 
  AND sample_time BETWEEN SYSDATE - (1 / 1440) 
  AND SYSDATE 
GROUP BY 
  sql_id 
ORDER BY 
  cpu_usage DESC;
 
  • session_state = 'ON CPU': CPU에서 실행 중인 세션만 조회.
  • cpu_usage: 특정 SQL이 실행된 횟수.

이 데이터를 활용하면 대량 트랜잭션이 실행될 때 CPU 부하를 유발하는 주요 SQL을 식별하고, 실행 계획을 최적화할 수 있다.


2. 디스크 I/O 부하가 많은 트랜잭션 분석

대량 트랜잭션이 실행되면서 디스크 I/O를 과도하게 사용하는 SQL을 찾으려면 ASH 데이터를 활용하여 'User I/O' 대기 이벤트를 분석할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS io_waits 
FROM 
  v$active_session_history 
WHERE 
  wait_class = 'User I/O' 
  AND sample_time BETWEEN SYSDATE - (1 / 1440) 
  AND SYSDATE 
GROUP BY 
  sql_id 
ORDER BY 
  io_waits DESC;
 
  • wait_class = 'User I/O': 디스크 읽기/쓰기 대기가 발생한 SQL만 조회.
  • io_waits: 해당 SQL이 디스크 I/O로 인해 대기한 횟수.

이 데이터를 활용하면 디스크 I/O 부하를 유발하는 트랜잭션을 식별하고, 인덱스 최적화 또는 실행 계획을 조정하는 등의 방법을 적용할 수 있다.


3. 블로킹 세션 및 트랜잭션 락 분석

트랜잭션이 많아지면 세션 간 락 충돌이 증가하여 블로킹 세션이 발생할 수 있다. 이를 감지하려면 다음 SQL을 실행한다.

SELECT 
  blocking_session, 
  session_id, 
  event, 
  wait_time 
FROM 
  v$session 
WHERE 
  blocking_session IS NOT NULL 
ORDER BY 
  wait_time DESC;
 
  • blocking_session: 다른 세션을 차단하는 블로킹 세션 ID.
  • session_id: 대기 중인 세션의 ID.
  • event: 대기 중인 이벤트.
  • wait_time: 대기 시간(밀리초).

이 데이터를 활용하면 어떤 트랜잭션이 블로킹 세션을 유발하는지 파악하고, 트랜잭션 크기를 줄이거나 실행 순서를 조정하는 방법으로 성능을 최적화할 수 있다.


트랜잭션 성능 최적화를 위한 해결 방법

트랜잭션 크기 조정

  • 대량 트랜잭션을 작은 단위로 나누어 락 대기 시간을 줄이고, 블로킹 세션 발생을 방지한다.
BEGIN 
FOR emp IN (
  SELECT 
    emp_id 
  FROM 
    employees 
  WHERE 
    department = 'Sales'
) LOOP 
UPDATE 
  employees 
SET 
  salary = salary * 1.1 
WHERE 
  emp_id = emp.emp_id;
COMMIT;
END LOOP;
END;
 
  • 결과: 트랜잭션이 작은 단위로 실행되면서 시스템 부하가 감소.

인덱스 최적화 및 실행 계획 조정

  • 디스크 I/O 부하를 줄이기 위해 Full Table Scan을 방지하고 적절한 인덱스를 추가한다.
CREATE INDEX emp_dept_idx ON employees(department);
 
  • 결과: 디스크 I/O 대기 시간이 감소하면서 트랜잭션 속도 향상.

락 충돌 방지 및 트랜잭션 동시성 조정

  • 락이 자주 발생하는 테이블에 대해 적절한 인덱스를 추가하여 충돌을 줄인다.
  • READ COMMITTED 등의 격리 수준을 조정하여 트랜잭션 간 락 대기를 줄인다.

 

ASH 데이터를 활용하면 대량 트랜잭션이 시스템에 미치는 영향을 실시간으로 분석하고, CPU 부하, 디스크 I/O 증가, 락 충돌 등의 문제를 신속하게 감지할 수 있다.

 

특히, CPU 사용량이 높은 SQL을 최적화하고, 불필요한 디스크 I/O를 줄이며, 트랜잭션 크기를 조정하여 락 충돌을 방지하면 성능을 크게 개선할 수 있다.