반응형

where 절에 function 쓰면 성능이슈가 있다고 한다.

실제로 본적은 많지 않은데... 오늘 장애를 만나면서 그 끝판왕을 보았다.

이슈를 기록하고 튜닝한 내용을 정리한다.

 

CREATE FUNCTION `xxx`.`FN_DATE_xxx`(varDate datetime) RETURNS datetime
BEGIN


declare varxxx datetime;
declare varDt varchar(8);

set varDt:= FN_YMD_xxx(varDate,'');

SELECT  STR_TO_DATE(concat(varDt,'000000'), '%Y%m%d%H%i%s') INTO varxxx
FROM    DUAL
;

RETURN varxxx;
END

fucntion에서 다시 function을 호출한다.

fucntion을 분석해보니 현재시간에서 일정기간을 뺀 range를 검색하는 목적으로 만든 듯했다.

개발당시 어떤 이슈가 있었는지는 모르지만 mysql function 레퍼런스를 확인할 시간적 여유가 없었나보다...

이게 쌓이고 쌓여 3년만에 대용량 테이블과 만나서 장애를 일으켰다...

 

튜닝)

// 수많은 join으로 되어있지만 대용량테이블 하나만 가지고 분석한다. 나머지 테이블 다붙여도 1초 내외이다.
//튜닝전
select * FROM xxxx.xxxxxxx AP
where 1=1 
AND AP.REG_DATE BETWEEN xxx.FN_DATE_xxx (xxx.FN_xxx(NOW(),-14)) AND NOW()  

//튜닝후
select * FROM xxxx.xxxxxxx AP
where 1=1 
AND AP.REG_DATE BETWEEN DATE_FORMAT(DATE_SUB(NOW(), interval 14 day),'%Y-%m-%d 00:00:00') and NOW()

튜닝전)

1) 플랜 : 1 SIMPLE AP  ALL REG_DATE    422277 11.11 Using where

2) 수행시간 : 51초

 

튜닝후)

1) 플랜 : 1 SIMPLE AP  range REG_DATE REG_DATE 5  23128 100 Using index condition

2) 수행시간 : 0.83초

 

where 조건절에는 웬만하면 function 쓰면 안되고 어쩔 수 없이 쓰더라도

mysql에서 기본으로 제공하는 function을 사용하는 것이 좋다.

 

 

 

반응형

'RDB > mysql' 카테고리의 다른 글

[튜닝] 니 형이 뭐야?  (0) 2020.04.13
slave online hot backup 구축  (0) 2020.04.11
mysql 컬럼 타입 datetime vs timestamp 차이  (0) 2020.04.08
[error] mysqldump: Got errno 28 on write  (0) 2020.04.02
SSD 파티션 튜닝 2  (0) 2020.03.31
블로그 이미지

dung beetle

취미는 데이터 수집 직업은 MYSQL과 함께 일하는 DBA의 소소한 일상 이야기

,