2021. 8. 8. 23:00ㆍMariaDB 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 로 변경해야한다.
'MariaDB DBMS > MariaDB 튜닝 1' 카테고리의 다른 글
[SQL 튜닝 실습] SQL 튜닝 기초 5 (0) | 2021.08.09 |
---|---|
[SQL 튜닝 실습] SQL 튜닝 기초 4 (0) | 2021.08.09 |
[SQL 튜닝 실습] SQL 튜닝 기초 2 (0) | 2021.08.08 |
[SQL 튜닝 실습] SQL 튜닝 기초 1 (0) | 2021.08.08 |