반응형
SMALL
필요 이상으로 많은 정보를 가져오는 나쁜 SQL 문
현황 분석
| 튜닝 전 실행 계획 |
사원 테이블에서 성별이 M(남)이고, 사원번호가 300,000을 초과하는 사원 대상으로 부서관리자 테이블과 외부 조인을 수행한 뒤, 해당하는 사원번호의 개수를 출력하는 쿼리
SELECT COUNT(사원번호) AS 카운트
FROM (
SELECT 사원.사원번호, 부서관리자.부서번호
FROM (SELECT *
FROM 사원
WHERE 성별 ='M' AND 사원번호 > 300000
) 사원
LEFT JOIN 부서관리자
ON 사원.사원번호 = 부서관리자.사원번호
) 서브쿼리
/* 실행계획 */
EXPLAIN
SELECT COUNT(사원번호) AS 카운트
FROM (
SELECT 사원.사원번호, 관리자.부서번호
FROM (SELECT *
FROM 사원
WHERE 사원번호 > 300000
) 사원
LEFT JOIN 부서관리자 관리자
ON 사원.사원번호 = 관리자.사원번호
) 서브쿼리;
- SQL문 결과 : 총 1건의 결과(60,108) 출력, 81.5ms 소요
- 드라이빙 테이블 : 사원 테이블, 드리븐 테이블 : 부서관리자 테이블
- 사원 테이블 : 사원번호 > 300000 조건 → 범위 스캔(type 항목 : range) 수행, 기본 키(key 항목: PRIMARY) 활용
- 부서관리자 테이블 : 사원.사원번호 = 관리자.사원번호의 외부 조인에 따라 키본 키를 활용하여 중첩 루프 조인할 때마다 1건의 데이터(rows 항목 : 1)에 접근
튜닝 수행
- 최종 결과로 사원 테이블의 사원번호 데이터 건수를 집계
- 부서관리자 테이블과 외부 조인하는 사원.사원번호 = 관리자.사원번호 조건이 꼭 필요한지 고민
튜닝 결과
| 튜닝 후 실행 계획 |
최종적으로 필요한 사원번호의 건수를 구하는 과정에서 부서관리자 테이블은 필요 없음
부서관리자 테이블과 관련된 부분을 제거하고 사원 테이블의 데이터에만 접근하도록 SQL 문을 간소화
EXPLAIN
SELECT COUNT(사원번호) AS 카운트
FROM 사원
WHERE 성별 = 'M' AND 사원번호 > 300000;
- 81.5ms → 28.3ms (시간 단축)
- 불필요한 연산 제거 (부서관리자 테이블 연산 작업)
- rows 항목 : 약 15만건 → 약 5만 건의 데이터에만 접근
* 참고
반응형
LIST
'SQL 튜닝 > SQL 문 재작성' 카테고리의 다른 글
[SQL 튜닝] 대량의 데이터를 가져와 조인하는 나쁜 SQL 문 (0) | 2023.07.29 |
---|---|
[SQL 튜닝] 비효율적인 페이징을 수행하는 나쁜 SQL 문 (0) | 2023.07.27 |
[SQL 튜닝] 처음부터 모든 데이터를 가져오는 나쁜 SQL 문 (0) | 2023.07.24 |
댓글