본문 바로가기
IT/AWR-ASH

ASH 데이터를 활용한 비정상적인 SQL 패턴 감지: 예상보다 자주 실행되거나 비정상적으로 실행 시간이 긴 SQL을 탐지하는 방법.

by free-inf 2025. 3. 5.

서버 이관 프로젝트를 진행하면서 새로운 환경에서 SQL 실행 패턴이 기존과 다르게 동작할 가능성이 높다. 데이터베이스 설정, 하드웨어 성능, 네트워크 속도 등의 변화로 인해 특정 SQL의 실행 시간이 길어지거나, 특정 SQL이 과도하게 실행되는 문제가 발생할 수 있다.

이러한 성능 저하를 방지하려면 비정상적인 SQL 패턴을 사전에 감지하고 최적화하는 것이 중요하다.

  • 실행 빈도가 비정상적으로 높은 SQL을 감지하면, 불필요한 반복 실행을 줄이고 리소스 낭비를 방지할 수 있다.
  • 실행 시간이 예상보다 길어진 SQL을 감지하면, SQL 실행 계획을 최적화하고 병목 현상을 해결할 수 있다.

이때 Oracle의 ASH(Active Session History) 데이터를 활용하면 실시간으로 SQL 실행 패턴을 분석할 수 있다. ASH 데이터는 초 단위로 활성 세션 정보를 기록하며, 실행 중인 SQL의 빈도, 실행 시간, 대기 이벤트(WAIT EVENT) 등의 정보를 분석하는 데 유용하다.

 

본 글에서는 ASH 데이터를 활용하여 비정상적인 SQL 패턴을 감지하는 방법과, 이를 해결하기 위한 최적화 전략을 상세히 설명한다. 이를 통해 서버 이관 후 발생할 수 있는 예상치 못한 성능 문제를 효과적으로 감지하고 해결할 수 있도록 한다.


비정상적인 SQL 패턴의 주요 유형

1. 실행 빈도가 비정상적으로 높은 SQL

  • 애플리케이션에서 같은 SQL이 반복적으로 실행되면, 데이터베이스 부하가 증가하고 성능이 저하될 수 있다.
  • 캐싱을 활용하지 않거나, 쿼리 최적화가 부족한 경우 불필요한 SQL 호출이 발생할 가능성이 높다.
  • 실행 빈도가 높은 SQL을 분석하고, 필요하면 실행 방식을 최적화해야 한다.

2. 실행 시간이 예상보다 긴 SQL

  • 데이터 양이 많아지면서 특정 SQL의 실행 시간이 길어질 수 있다.
  • 잘못된 실행 계획이 선택되거나, 인덱스를 활용하지 못하는 경우 성능 저하가 발생할 가능성이 크다.
  • 실행 시간이 긴 SQL을 분석하여 실행 계획을 최적화해야 한다.

3. 특정 시간대에 집중적으로 실행되는 SQL

  • SQL 실행이 특정 시간대(예: 업무 시작 시간, 배치 작업 수행 시간)에 집중되면 CPU 사용률과 디스크 I/O 부하가 급격히 증가할 수 있다.
  • 이러한 패턴을 감지하고, SQL 실행 시간을 분산하여 성능을 최적화할 필요가 있다.

4. 불필요한 반복 실행으로 인한 리소스 낭비

  • 특정 SQL이 동일한 데이터를 반복적으로 조회하면, 불필요한 리소스 사용이 증가할 수 있다.
  • 특정 애플리케이션에서 예상보다 자주 실행되는 SQL을 분석하고, 캐싱(Cache)이나 바인드 변수 활용을 고려해야 한다.

ASH 데이터를 활용한 비정상적인 SQL 감지 방법

1. 실행 빈도가 비정상적으로 높은 SQL 조회

실행 빈도가 높은 SQL을 분석하려면 ASH 데이터를 활용하여 특정 SQL의 실행 횟수를 조회할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS execution_count 
FROM 
  v$active_session_history 
WHERE 
  sample_time >= SYSDATE - (1) -- 최근 24시간 조회
GROUP BY 
  sql_id 
ORDER BY 
  execution_count DESC FETCH FIRST 10 ROWS ONLY;
  • execution_count → 실행 빈도가 높은 SQL을 찾는 데 활용.

이 데이터를 활용하면 과도하게 실행되는 SQL을 식별하고, 필요하면 캐싱(Cache) 적용이나 실행 방식 변경을 고려할 수 있다.


2. 실행 시간이 예상보다 긴 SQL 조회

실행 시간이 길어지는 SQL을 감지하려면 ASH 데이터를 활용하여 평균 실행 시간을 계산할 수 있다.

SELECT 
  sql_id, 
  COUNT(*) AS execution_count, 
  AVG(elapsed_time) AS avg_execution_time 
FROM 
  v$active_session_history 
WHERE 
  session_state = 'WAITING' 
  AND sample_time >= SYSDATE - (1) -- 최근 24시간 조회
GROUP BY 
  sql_id 
ORDER BY 
  avg_execution_time DESC FETCH FIRST 10 ROWS ONLY;
  • avg_execution_time → 특정 SQL의 평균 실행 시간 확인.

이 데이터를 활용하면 실행 시간이 비정상적으로 긴 SQL을 분석하고, 실행 계획을 최적화할 수 있다.


3. 특정 시간대에 집중적으로 실행되는 SQL 조회

SQL이 특정 시간대에 집중적으로 실행되는지 확인하려면 ASH 데이터를 활용하여 시간별 실행 패턴을 분석할 수 있다.

SELECT 
  TO_CHAR(sample_time, 'YYYY-MM-DD HH24') AS time_slot, 
  COUNT(*) AS execution_count 
FROM 
  v$active_session_history 
WHERE 
  sample_time >= SYSDATE - (7) -- 최근 7일간 데이터 조회
GROUP BY 
  TO_CHAR(sample_time, 'YYYY-MM-DD HH24') 
ORDER BY 
  time_slot;
  • time_slot → 특정 시간대의 SQL 실행 빈도를 분석하는 데 활용.

이 데이터를 활용하면 SQL 실행이 특정 시간대에 집중되는 패턴을 분석하고, 트래픽이 높은 시간대에 부하를 분산할 수 있는 전략을 세울 수 있다.


비정상적인 SQL 패턴 최적화를 위한 해결 방법

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. 특정 시간대에 집중되는 SQL 부하 분산

  • 트래픽이 높은 시간대에 배치 작업을 피하거나, 트랜잭션을 분산하여 실행한다.
  • 리소스 사용량이 많은 작업은 오프 피크 타임(off-peak time)으로 조정한다.
ALTER SYSTEM SET resource_manager_plan = 'LOW_PRIORITY_WORKLOAD_PLAN';

4. 불필요한 반복 실행 최소화

  • 동일한 데이터를 반복적으로 조회하는 SQL은 캐싱(Cache)하여 불필요한 실행을 줄인다.
  • 클라이언트 애플리케이션에서 동일한 요청이 반복되지 않도록 쿼리 구조를 개선한다.

ASH 데이터를 활용하면 비정상적인 SQL 실행 패턴을 실시간으로 감지할 수 있으며, 실행 빈도, 실행 시간, 특정 시간대의 실행 패턴 등의 요소를 효과적으로 모니터링할 수 있다.

 

특히, 자주 실행되는 SQL을 최적화하고, 실행 시간이 긴 SQL을 튜닝하며, 특정 시간대의 부하를 분산하면 데이터베이스 성능을 크게 개선할 수 있다.