mysql left outer join시 속도저하... 0 5 1,452

by 오동 [MySQL] [2018.01.04 15:25:01]


안녕하세요.

oracle 쿼리를 mysql로 마이그레이션 중인데 해당부분에서 심각한 속도저하 현상이 발생해 글을 올려봅니다.

 - TEST1 테이블 row수 : 20215

 - TEST2 테이블 row수 : 13297

1. 오라클 쿼리

SELECT DECODE(B.TRAN_PR, NULL, 3, TRAN_TYPE), TRAN_GRPSEQ, TRAN_ETC3, TO_CHAR(TRAN_SENDDATE, 'YYYYMMDD'), TRAN_RSLT, COUNT(*), TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')
FROM TEST1 A, TEST2 B
WHERE 1=1 
AND TRAN_SENDDATE BETWEEN TRUNC(SYSDATE-65) AND TRUNC(SYSDATE-2)-(1/86400)
AND A.TRAN_PR = B.TRAN_PR(+)
GROUP BY DECODE(B.TRAN_PR, NULL, 3, TRAN_TYPE), TRAN_GRPSEQ, TRAN_ETC3, TO_CHAR(TRAN_SENDDATE, 'YYYYMMDD'), TRAN_RSLT;

2. MYSQL로 마이그레이션한 쿼리

SELECT IF(B.TRAN_PR IS NULL, 3, TRAN_TYPE), TRAN_GRPSEQ, TRAN_ETC3, DATE_FORMAT(TRAN_SENDDATE, '%Y%m%d'), TRAN_RSLT, COUNT(*), DATE_FORMAT(NOW(),'%Y%m%d%T')
 FROM TEST1 A LEFT OUTER JOIN TEST2 B
 ON A.TRAN_PR = B.TRAN_PR
WHERE 1=1 
 AND TRAN_SENDDATE BETWEEN date_add(DATE_FORMAT(NOW(), '%Y-%m-%d'), interval -65 day) AND date_add(DATE_FORMAT(NOW(), '%Y-%m-%d'), interval -2 day)
GROUP BY IF(B.TRAN_PR IS NULL, 3, TRAN_TYPE), TRAN_GRPSEQ, TRAN_ETC3, DATE_FORMAT(TRAN_SENDDATE, '%Y%m%d'), TRAN_RSLT;

 

오라클 쿼리를 돌렸을때는 1초가량의 시간이 걸린반면 MYSQL쿼리를 돌렸을경우에는 몇분을 기다려도 결과값을 가져오지 못합니다...

제가 마이그레이션을 잘못한건지.. 튜닝이 필요한건지 알려주시면 감사하겠습니다.

by 마농 [2018.01.04 15:41:39]

인덱스 생성 안하신 듯.


by 오동 [2018.01.04 16:07:26]

ORACLE과 똑같이 TEST1에는 인덱스가 생성되어있고, TEST2에는 인덱스가 없습니다.

같은 조건이라면 또 확인해야할 부분이 어디인가요?


by 주킹 [2018.01.04 16:33:54]

explain을 올려주셔야 할듯하네요..

어떠한 형식으로 풀렸는지 보셔야합니다.

오라클에서 Migration하기에는 postgreSQL이 더 적합한데 아쉽네요 ㅋ 물론 서비스에 따라 다를수야 있겠지만..


by 마농 [2018.01.04 17:21:50]

오라클은 인덱스가 없어도 RIGHT HASH 조인이 가능하지만
mysql 은 그런 기능이 없을 것 같네요.
인덱스를 만들어 주세요.


by 주킹 [2018.01.05 08:33:10]

mysql은 hash,merge가 없고 비슷한것은 있는데 그부분이 문제일듯하기도 하네요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입