관리 메뉴

JIE0025

[쿼리 튜닝] 시스템 응답 속도 개선 과정 본문

백엔드/이슈, 트러블슈팅

[쿼리 튜닝] 시스템 응답 속도 개선 과정

Kangjieun11 2024. 12. 2. 14:55
728x90

 

상황

1. 모듈A 에서 메뉴 하나를 개발했다.

2. 단순조회를 하는데, 모듈A, 모듈B, 모듈C에서 쿼리 결과를 가져와 띄어주는 상황이다. 

3. 모듈A에서 B, C로 인터페이스를 요청하여 조회할 내용을 가져온다. 

4. 모듈 C에서의 응답에서 에러가 발생하였음

 

문제정의

1. 인터페이스 요청 및 응답까지 1분이상 소요되었다.

2. 모듈C의 로컬확인 결과, WAS에서 응답을 잘 돌려주는 것을 보았다. 

>> 자바/ 쿼리의 문제가 아님

>> 대신 응답까지 33초 걸림 

 

3. 인터페이스 중간관리 시스템에서 30초 이상 걸릴 경우

호출한 클라이언트 쪽으로 TIME_OUT을 내고 있었다. 

 

따라서 응답 속도를 30초 이내로 만들면 화면에 정상적으로 띄울 수 있다.

 

 

기존쿼리 

SELECT COUNT(*) AS CNT

FROM (
    SELECT MNG_NO FROM TB_C
      WHERE MNG_NO IS NOT NULL  
       AND R_ID IS NOT NULL
       AND C_DATE <= '20240630'
       GROUP  BY MNG_NO
) ;



쿼리 실행계획과 COST확인

 

아래 결과는 실제로 돌려본 
데이터 접근시 FULL SCAN하여 나온 COST이다.  .

 


옵티마이저가 FULL SCAN 처리하여

Cost = 25,096

CPU Cost = 3,065,790,207 를 확인했다.

 

 

 


DB 쿼리 튜닝

 

위 쿼리의 경우는 단순 인덱스 처리시 조회속도가 개선될 수 있다. 

 

조건문이 3개 있기 때문에 

조건문과 관련된 3개의 컬럼을  인덱스 생성해주어야한다.

 

특히 MNGM_NO, R_ID의 경우  NULL이 아닌 조건을 필터링하기 때문에

결합 인덱스로 생성시 성능에 도움이 된다.

 

추후 시스템에서 해당 쿼리를 조회할 떄마다 생성한 인덱스를 사용하게 된다. 

 

CREATE INDEX DBC.TB_C_IX03  
ON  DBC.TB_C
(MNGM_NO, R_ID, C_DATE )
TABLESPACE TS_C01;

 

 

 

이제 튜닝이후 실행계획과 Cost를 확인해보자.

Cost =  3144   CPU Cost =  341,345,584 를 확인했다.

                     

Cost, CPU Cost 둘다 약 8배 ~ 10배까지  개선된것을 확인할 수 있다.                             

 

 

 

 

화면에 띄우는 기준으로는 1분에서 -> 6초 정도로 개선됨을 확인했다.