[쿼리 튜닝] 시스템 응답 속도 개선 과정
상황
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초 정도로 개선됨을 확인했다.