반응형
SMALL
습관적으로 중복을 제거하는 나쁜 SQL 문
현황 분석
| 튜닝 전 실행 계획 |
부서 관리자의 사원번호와 이름, 성, 부서번호 데이터를 중복 제거하여 조회하는 쿼리
EXPLAIN
SELECT DISTINCT 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호
FROM 사원
JOIN 부서관리자
ON (사원.사원번호 = 부서관리자.사원번호);
- 부서 관리자 테이블 컬럼 수 : 24
- SQL문 결과 : 총 24건의 결과 출력, 0.4ms 소요
- 드라이빙 테이블인 부서관리자 테이블과 드리븐 테이블인 사원 테이블의 id 값 둘다 1로 동일하게 나타남 → 서로 조인
- 부서관리자 테이블의 type 항목 : index → 인덱스 풀 스캔 방식 수행
- 사원 테이블의 type 항목 : eq_ref → 사원번호라는 기본 키를 사용해서 단 1건의 데이터를 조회하는 방식으로 조인됨
- DISTINCT를 수행하고자 별도의 임시테이블(Extra 항목 : Using temporary)을 만들고 있음
튜닝 수행
사원 테이블의 키본 키 : 사원번호 → SELECT 절에 작성된 사원.사원번호에는 중복된 데이터가 없음
굳이 DISTINCT라는 키워드로 정렬 작업을 하고 중복을 제거하는 작업이 불필요
TIP DISTINCT 구문 안의 숨은 작업
DISTINCT 키워드는 나열된 열들을 정렬한 뒤 중복된 데이터를 삭제
DISTINCT를 쿼리에 작성하는 것만으로도 정렬 작업이 포함된을 인지해야 함
이미 정렬된 키본 키나 인덱스를 활용하는 경우라면 정렬 작업의 부담은 덜 수 있음
튜닝 결과
| 튜닝 후 실행 계획 |
사원 테이블의 사원번호 열이 키본 키라서 중복된 데이터가 출력될 수 없으므로 DISTINCT 키워드 제거
EXPLAIN
SELECT 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호
FROM 사원
JOIN 부서관리자
ON (사원.사원번호 = 부서관리자.사원번호);
0.4ms → 0.4ms (변화 없음) → 데이터가 수십 건 밖에 안되서 소요 시간을 기준으로 튜닝 여부를 판단하기 어려움
extra 항목 : Using temporary 삭제
임시 테이블에서 정렬과 중복제거를 수행하지 않아도 되므로 불필요한 작업을 제거하여 튜닝 완료
* 참고
반응형
LIST
'SQL 튜닝 > SQL 문 단순 수정' 카테고리의 다른 글
[SQL 튜닝] 인덱스 고려 없이 열을 사용하는 나쁜 SQL 문 (0) | 2023.07.15 |
---|---|
[SQL 튜닝] 다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문 (0) | 2023.07.14 |
[SQL 튜닝] 열을 결합하여 사용하는 나쁜 SQL 문 (0) | 2023.07.12 |
[SQL 튜닝] 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 (0) | 2023.07.11 |
[SQL 튜닝] 사용하지 않는 함수를 포함하는 나쁜 SQL 문 (0) | 2023.07.10 |
댓글