[SQL 튜닝 실습] SQL 튜닝 기초 3

2021. 8. 8. 23:00MariaDB DBMS/MariaDB 튜닝 1

반응형

습관적으로 중복을 제거하는 나쁜 SQL문

튜닝 전 SQL문

select distinct 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호						
from 사원						
join 부서관리자						
on (사원.사원번호 = 부서관리자.사원번호)

 

튜닝 전 실행계획

explain						
select distinct 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호						
from 사원						
join 부서관리자						
on (사원.사원번호 = 부서관리자.사원번호)

테이블 id값이 둘 다 1로 서로 조인하고 있으며
부서관리자 테이블은 인덱스 풀 스캔, 사원 테이블은 사원번호라는 기본키를 사용해서 

단 1건의 데이터 조회하는 방식으로 조인
distinct() 를 위해 별도 임시테이블 (extra 항목 : Using temporary)을 생성
(*) distinct() 는 나열된 열들을 정렬한 후 중복된 데이터는 삭제하므로, 기본적으로 정렬연산이 들어가기때문에 주의해야한다.

 

튜닝 후 SQL 문

select 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호					
from 사원					
join 부서관리자					
on (사원.사원번호 = 부서관리자.사원번호)

튜닝 전 SQL문에서 distinct 키워드만 제거한 쿼리로, 
사원 테이블의 사원번호 컬럼이 기본키라서 distinct() 가 필요없었다.

성능결과는 0초로 같지만, 데이터 량이 많았다면 차이가 있었을 것이다.

 

튜닝 후 실행계획

explain					
select 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호					
from 사원					
join 부서관리자					
on (사원.사원번호 = 부서관리자.사원번호)

(*) Extra 항목에서 Using temporary 가 사라졌는데, 필요없는 distinct() 가 제거됐기때문에 불필요한 작업이 필요없게됐다.

 


다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문

 

튜닝 전 SQL 문

select 'M' as 성별, 사원번호		
from 사원		
where 성별 = 'M'		
and 성 = 'Baba'		
union		
select 'F', 사원번호		
from 사원		
where 성별 = 'F'		
and 성 = 'Baba'

id가 1인 테이블의 조회로 I_성별_성 인덱스를 사용
id가 2인 테이블의 조회로 I_성별_성 인덱스를 사용
마지막으로 테이블 1과 테이블 2의 결과를 병합 및 정렬을 한 후 중복을 제거하는 작업 처리
즉, extra컬럼에는 모든 과정을 다 표시는 하지않기때문에 여기서 표시되지는 않았지만, 

정렬과정에서 Using temporary를 사용했음을 알 수 있다.
만약, 두 테이블이 각각 조회된 데이터량이 많았다면, 

메모리가 아닌 디스크상에서 임시파일을 생성하여 UNION 작업을 수행한다.

 

튜닝 후 실행계획

explain		
select 'M' as 성별, 사원번호		
from 사원		
where 성별 = 'M'		
and 성 = 'Baba'		
union all		
select 'F', 사원번호		
from 사원		
where 성별 = 'F'		
and 성 = 'Baba'

 

사원 테이블 인덱스 확인

show index
from 사원

성 컬럼이 동등조건(=)으로 작성되어있기때문에 성별 컬럼과 성 컬럼으로 정의된 I_성별_인덱스 를 활용해서 데이터를 빠르게 조회가능하다.
이 때 이미 기본키로 조회하기때문에 굳이 정렬 작업이 필요없으므로 union이 아닌 union all 로 변경해야한다.

 

반응형