- 정보공유
[SQL] 쿼리 성능 최적화
SELECT rm_ix, rm_date, rm_pos, rm_subject
FROM (SELECT COUNT(*) AS cnt, b.rm_ix, b.rm_subject FROM tblA as a inner join tblB as b on a.idx = b.idx where a.bk_status in ('대기', '완료') GROUP BY b.rm_ix, b.rm_date, b.rm_pos) AS GP
WHERE GP.cnt > 1
ORDER BY rm_date, rm_pos, cnt
를 아래와 같이 성능을 개선해서 사용가능하다.
1. 인덱스 최적화: tblA.bk_status, tblB.idx, tblB.rm_ix, tblB.rm_date 등에 적절한 인덱스를 추가.
2. 서브쿼리 제거: 현재 서브쿼리로 COUNT(*)를 계산한 후 필터링하는데, HAVING COUNT(*) > 1을 사용하면 불필요한 중첩을 줄일 수 있음.
3. JOIN 순서 최적화: g5_wb_booking을 먼저 필터링한 후 g5_wb_booking_location과 JOIN하면 불필요한 데이터 로딩을 줄일 수 있음.
SELECT
b.rm_ix,
b.rm_date,
b.rm_pos,
COUNT(*) AS cnt,
b.rm_subject
FROM tblA AS a
INNER JOIN tblB AS b
ON a.idx = b.idx
WHERE a.bk_status IN ('대기', '완료')
GROUP BY b.rm_ix, b.rm_date, b.rm_pos, b.rm_subject
HAVING COUNT(*) > 1
ORDER BY b.rm_date, b.rm_pos, cnt DESC;
개선 사항:
1. 서브쿼리 제거 → 직접 HAVING COUNT(*) > 1 사용하여 필터링.
2. 인덱스 활용 → tblA.bk_status 에 인덱스가 있으면 필터링 속도 증가.
3. 필요한 컬럼만 GROUP BY → 기존보다 더 많은 컬럼을 그룹핑해서 중복을 최소화.
인덱스를 확인하고 없으면 추가.
CREATE INDEX idx_booking_status ON tblA (bk_status);
CREATE INDEX idx_booking_location ON tblB (idx, rm_ix, rm_date, rm_pos);