일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- softeer
- programmers
- C++
- 백준
- 파이썬
- 회고
- 백준알고리즘
- python
- 공부일지
- 정보처리산업기사
- BFS
- 코틀린
- 소프티어
- 시나공
- kotlin
- SW봉사
- MYSQL
- 프로그래머스
- 문제풀이
- 자바
- java
- 스프링
- SQL
- 데이터베이스
- CJ UNIT
- 알고리즘
- 코딩교육봉사
- 1과목
- 코딩봉사
- 백준 알고리즘
- Today
- Total
JIE0025
[쿼리 튜닝] 시스템 응답 속도 개선 과정 본문
상황
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초 정도로 개선됨을 확인했다.
'백엔드 > 이슈, 트러블슈팅' 카테고리의 다른 글
[개발/JS] 다른 모듈의 팝업을 호출하여 발생한 Cross-Origin 문제 해결과정 - postMessage() (1) | 2024.12.03 |
---|---|
[리팩토링] Mapper 캐시 설정 변경으로 데이터 무결성 지키기 (MyBatis - useCache, flushCache) (0) | 2024.04.29 |
한 트랜잭션에서 동일한 데이터를 조회하면? (MyBatis의 캐싱전략과 localCacheScope 설정하기) (0) | 2024.04.16 |
[AWS] EC2 프리티어 메모리 부족으로 발생한 빌드 실패와 해결과정 (0) | 2023.06.24 |
보이어무어로 한글을 매칭하면 성능이 안좋다 ? (효율적으로 문자열 매칭하기) (0) | 2023.06.13 |