-
SQL BOOSTER - SQL 작성 가이드(3)DataBase/SQL 2024. 7. 15. 13:47
1. 작업량을 줄이자
SQL 성능을 높이려면 IO를 개선하는 것이 기본 원칙이다. IO를 더 줄일 수 없다면 작업량을 줄이는 아이디어가 필요하다.
SELECT T1.CUS_ID, SUM(T1.UNT_PRC * T1.ORD_QTY)ORD_AMT , SUM(CASE WHEN T1.ORD_YMD LIKE '201701%' THEN T1.UNT_PRC * T1.ORD_QTY END) AMT_01 --12월까지 반복 FROM T_ORD_JOIN T1 GROUP BY T1.CUS_ID ORDER BY SUM(T1.UNT_PRC * T1.ORD_QTY) DESC;
위 SQL은 WHERE 조건절이 없다. 따라서 T_ORD_JOIN 모두를 읽어야 한다. 위 SQL의 실행계획은 아래와 같다.
위 SQL의 성능을 개선해보자 CASE가 12번 사용되고, T_ORD_BIG에는 3백만 건 정도의 데이터가 있다.
그러므로 3백만 * 12번 처리된다고 추론할 수 있다. CASE문의 횟수를 줄이면 성능이 좋아질 수 있다.
CASE문의 횟수를 줄이는 방법은 CASE 처리하기 전에 고객별,주문년월별 주문금액을 먼저 집계하면 된다.
FROM ( SELECT A.CUS_ID,SUBSTR(A.ORD_YMD,1,6), SUM(A.UNT_PRC * A.ORD_QTY) ORD_AMT FROM T_ORD_JOIN A GROUP BY A.CUS_ID, SUBSTR(A.ORD_YMD,1,6) )T1 GROUP BY T1.CUS_ID ORDER BY SUM(T1.ORD_AMT)DESC;
SQL을 개발하다 보면 CASE문이나 DECODE를 많이 사용하게 된다. 대량의 데이터를 처리할 때는
CASE나 DECODE의 위치에 따라 성능 차이가 날 수 있다. CASE를 적용할 대상을 줄일 방법이 있다면
최대한 줄여주는 노력이 필요하다.
*조인도 마찬가지이다. 조인 후 조건으로 거르지말고, 조인 전에 조건으로 걸러진 테이블과 조인하는 편이 좋다.
2. 집계 테이블을 고민해보자
집계 테이블은 실적 테이블을 특정 수준으로 집계 해놓은 테이블이다.
집계 테이블의 장점
- 계속 입력, 변경되는 실적 테이블에 접근하는 부담을 줄여준다.
- 실적 데이터가 집계된 형태로 저장되므로, 데이터 건수가 줄어들어 조회 성능이 높아진다.
집계 테이블의 단점
- 관리 비용 증가
- 집계를 수행하는 배치 작업과 배치를 실행할 스케줄을 생성해야한다.
- 비실시간 데이터
- 특정 시간 이전에 발생한 실적들을 모아서 집계하므로, 화면마다 데이터가 다를 수도 있다.
- 집계 과정의 오류
- 집계 중 오류가 발생할 수 있다. (집계 데이터 잘못 생성 혹은 생성 x)
집계 테이블은 위와 같은 장점과 단점을 모두 가지므로, 사용할 때 이모저모 따져보도록 하자
'DataBase > SQL' 카테고리의 다른 글
SQL BOOSTER - SQL 작성 가이드 (2) (0) 2024.07.15 SQL BOOSTER - SQL 개발 가이드 (0) 2024.07.12 SQL BOOSTER 페이징 기술 (0) 2024.07.11 SQL BOOSTER - 분석함수 (0) 2024.07.10 SQL BOOSTER - 문서번호 처리 기술 (0) 2024.07.09