MySQL.SQL튜닝.WHERE절의 INFULL 사용 시 성능저하 튜닝 본문

IT Cafe+/MySQL

MySQL.SQL튜닝.WHERE절의 INFULL 사용 시 성능저하 튜닝

고드림 2019. 11. 26. 16:25

튜닝 대상 쿼리문

SELECT ti.*

 FROM ti  
WHERE ti.agr_dy = IFNULL('20191125',DATE_FORMAT(SYSDATE(),'%Y%m%d')) 

;

 

ti 테이블의 인덱스는

IX_TI_01(agr_dy) 있음.

 

그런데

explain을 보면

Using Temporary 가 보이고. rows 도 9백만건으로 테이블 전체 건수이다.

filtered 가 보이므로

ti.agr_dy = IFNULL('20191125',DATE_FORMAT(SYSDATE(),'%Y%m%d')) 조건이 인덱스를 타지 않고

fileter 로 처리되었다.

 

튜닝1 

 - 조건절의 IFNULL() 를 IF~THEN 구문으로 대체

 -  ti.agr_dy = l_arg_dy  조건을 WHERE절 맨 처음으로 위치.

    (순서를 변경하니 using temporary 가 없어지면서 빨라짐)

 

IF l_arg_dy IS NULL THEN

   SET  l_arg_dy = DATE_FORMAT(SYSDATE(),'%Y%m%d')) ;

END IF;

 

SELECT ti.*

 FROM ti  
WHERE ti.agr_dy = l_arg_dy 

;

 

 

튜닝2. 조건을 subquery 로 해도 됨.

SELECT ti.*

 FROM ti  
WHERE ti.agr_dy = (SELECT IFNULL('20191125',DATE_FORMAT(SYSDATE(),'%Y%m%d')) )

;

  

Comments