or -> union 쿼리 튜닝하려고
실제 실행계획상에서 or는 풀 인덱스 스캔 발생하는 거 확인해서
union으로 바꿔 인덱스 잘 타게 만들어서 or, union쿼리 각각 explain ananlyze했을때 actual time이 빨라진거 확인한다음
(실제로 쿼리 실행 시에도 union쿼리가 더 빠르게 나옴, mysql workbench환경에서)
spring jpa에서 or쿼리는 jpql쓰고, union 쿼리는 nativie query로 작성해서 실제로 성능테스트하니깐
or쿼리가 월등히 성능이 좋게나오는 건뭐지(or는 60ms정도 나오고 union은 600나옴)
그래서 union쿼리를 jdbc로 바꿔서 성능테스트했는데도 or쿼리보단 성능이 안좋은데 이거 원인이 뭐임?
mysql은 모르겟고 오라클은 or expansion이라고 or조건을 자동적으로 union all로 변환시켜주는 기능도 있음. 쿼리는 결국 니가 뭘 가져오고싶어하는지에 대한 선언적 문법이고 내부 동작은 니가 힌트로 강제하지않는이상 dbms마다(심지어 버전마다) 그리고 통계데이터에 따라 옵티마이저가 다른 실행계획을 안내함. 뭐가 문제인지는 전문가가와도 장담못함 그때그때 실행계획 까봐야암
근데 spring 로그보면 나가는쿼리가 찍히는데 이게 실제로 실행되는 쿼리가 아닌건가
@글쓴 백갤러(119.201) 맞을껄
@밀우 근데 or 조건을 union all로 변환해준다고 하면 성능이 똑같아야되는거아닌가? 이것만 하루종일 잡고 있어서 정신나가겟네
니가말한것만 봐서는 나도 원인을 모르지 union할때 인덱스를 잘못타고있을 가능성도있지
실행계획을 어떻게 보여주지
@글쓴 백갤러(119.201) 일단 select 문 2개는 인덱스 잘 타고, 서브쿼리 합칠때는 order by로 using filesort 발생하긴하는데 인덱스 풀스캔보다는 랜덤 I/O가 덜 발생해서 union all하는게 성능이 좋게 나오긴함(workbench 환경에서는)
@글쓴 백갤러(119.201) 원래 union은 쓰는거아님. 중복제거땜에 강제로 sorting area 사용해서 실무에선 거의 사용앙함
union이 아니라 union all 사용함
실제로 나가는 쿼리는 올려줘야 우리도 알지 - dc App
[or 쿼리] 설렉트 * 프롬 rental 웨어 rental_status = 'OVERDUE' (rental_status = 'ON_RENT' and due_date BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 2 DAY)) 오더바이 due_date 리밋 30000, 10;
[union all 쿼리] (설렉트* 프롬 rental 웨어 rental_status = 'OVERDUE' 오더바이 due_date LIMIT 30010) UNION ALL(설렉트 * 프롬 rental 웨어 due_date<=DATE_ADD(NOW(), INTERVAL 2 DAY) and rental_status='ON_RENT' 오더바이 due_date, id LIMIT 30010) 오더바이 due_date 리밋 30000, 10;