마리아DB 튜닝 실습(5)
-
[SQL 튜닝 실습] SQL 튜닝 중급 4
비효율적인 인덱스를 사용하는 나쁜 SQL 문 튜닝 전 SQL 문 select 사원번호, 이름, 성 from 사원 where 성별 = 'M' and 성 = 'Baba'; 튜닝 전 실행 계획 explain select 사원번호, 이름, 성 from 사원 where 성별 = 'M' and 성 = 'Baba'; I_성별_성 인덱스를 활용해서 사원테이블에 접근 성별과 성 컬럼에 고정된 값으로 조건절 ref 항목 : const, const를 작성해서 인덱스 스캔으로 원하는 데이터에 접근 튜닝 수행 select count(distinct 성) 성_개수, count(distinct 성별) 성별_개수 from 사원; 사원 테이블의 인덱스 show index from 사원; 데이터값이 다양하지 않은 성별 컬럼을 선두로 구..
2021.08.10 -
[SQL 튜닝 실습] SQL 튜닝 중급 2
필요 이상으로 많은 정보를 가져오는 나쁜 SQL 문 튜닝 전 SQL 문 select count(사원번호) as 카운트 from ( select 사원.사원번호, 부서관리자.부서번호 from ( select * from 사원 where 성별 = 'M' and 사원번호 > 300000 ) 사원 left join 부서관리자 on 사원.사원번호 = 부서관리자.사원번호 ) 서브쿼리; 튜닝 전 실행계획 id가 1인 행만 있으므로 먼저 출력된 사원테이블이 데이터에 접근하는 드라이빙 테이블이고 나중에 출력된 부서관리자 테이블이 드리븐 테이블임을 알 수 있다. 사원 테이블은 사원번호 > 300000 조건때문에 레인지스캔을 수행하며 기본키를 활용해서 데이터에 접근할 것임을 알 수 있다. 부서관리자 테이블은 사원.사원번호 =..
2021.08.09 -
[SQL 튜닝 실습] SQL 튜닝 중급 1
SQL 문 재작성으로 착한쿼리 만들기 처음부터 모든 데이터를 가져오는 나쁜 SQL 문 튜닝 전 SQL 문 select 사원.사원번호, 급여.평균연봉, 급여.최고연봉, 급여.최저연봉 from 사원, ( select 사원번호, round(avg(연봉),0) 평균연봉, round(max(연봉),0) 최고연봉, round(min(연봉),0) 최저연봉 from 급여 group by 사원번호 ) 급여 where 사원.사원번호 = 급여.사원번호 and 사원.사원번호 between 10001 and 10100; 튜닝 전 실행계획 튜닝 후 SQL 문 select 사원.사원번호, ( select round(avg(연봉), 0) from 급여 as 급여1 where 사원번호 = 사원.사원번호 ) as 평균연봉, ( sele..
2021.08.09 -
[SQL 튜닝 실습] SQL 튜닝 준비 5
DEPENDENT SUBQUERY UNION 또는 UNION ALL 을 사용하는 서브쿼리가 메인테이블에 영향을 받는 경우로, UNION 으로 연결된 단위 쿼리들 중에서 처음으로 작성한 단위쿼리에 해당되는 경우이다. UNION으로 연결되는 첫번째 단위쿼리가 독립적으로 수행하지 못하고 메인테이블로부터 값을 하나씩 공급받는 구조이므로 성능적으로 불리하여 SQL문이 튜닝대상이 된다. explain select 관리자.부서번호, ( select 사원1.이름 from 사원 as 사원1 where 성별 = 'F' and 사원1.사원번호 = 관리자.사원번호 union all select 사원2.이름 from 사원 as 사원2 where 성별 = 'M' and 사원2.사원번호 = 관리자.사원번호 ) as 이름 from ..
2021.08.09 -
[SQL 튜닝 실습] SQL 튜닝 준비 4
PRIMARY explain select 사원1.사원번호, 사원1.이름, 사원1.성 from 사원 as 사원1 where 사원1.사원번호 = 100001 union all select 사원2.사원번호, 사원2.이름, 사원2.성 from 사원 as 사원2 where 사원2.사원번호 = 100002; SUBQUERY 독립적으로 실행되는 서브쿼리로 SELECT절의 스칼라 서브쿼리와 WHERE 절의 중첩 서브쿼리일 경우에 해당 explain select ( select count(*) from 부서사원_매핑 as 매핑 ) as 카운트, ( select max(연봉) from 급여 ) as 급여; 2번과 3번의 id값의 서브쿼리는 각각 독립적으로 실행된다. DERIVED FROM 절에 작성된 서브쿼리로 FROM ..
2021.08.09