안녕하세요. 고수님들께 조언을 구하고자 ㅜㅜ
지금 퇴사한 개발자의 업무를 이어받아서 소스를 분석하고있는데요.
사이트 이동속도가 너무느려 확인해보니.
현재 DB용량이 830MB입니다.
문제는 이 디비용량이 고정적이 아니라 외부업체에서 매 초마다 데이터를 인서트를 한다고 하네요.
외부업체에서 제공한 테이블을 열어보니 pk만 있을뿐 그외 다른 인덱스는 잡혀있지 않습니다.
소스를 봐도 어디서부터 손을 봐야 할지 막막하네요. ㅡㅡ
group by는 왜이용한건지, 그러면서 왜 모든컬럼을 불러오는지...
아래소스는 한페이지에 있는 소스의 일부분입니다.
소스구현이라든가, 조인부분의 잘못된 부분이 있으면 고수님들의 조언바랍니다.
select * from ( select ri.* from Rcv_Inverter ri, mt_Device md where ri.MBus_Address = md.MBus_Address and md.Site_ID = '$site_id' and ri.Site_ID = '$site_id' and ri.RcvTime like '$prev_month%' order by ri.RcvTime desc ) as Rcv_Inverter_sub group by Rcv_Inverter_sub.MBus_Address
최종 정렬이 필요한 상황이라면 맨 마지막에 정렬하는게 맞구요.
중간 단계에서의 정렬은 마지막에 정렬이 흐트러질 가능성이 있으므로.
서브쿼리 안에서의 정렬은 무의미한 경우가 많긴 하지만...
서브쿼리 안에서의 정렬이 의미있는 경우도 물론 존재합니다.
위 구문을 다시 한번 살펴보니 정렬이 의미있는 구문일지도 모른다는 생각이 드네요.
mysql 에서만 가능한 그룹바이를 사용했는데 서브쿼리에서 정렬을 했습니다.
SELECT * FROM (...) GROUP BY MBus_Address;
이 구문의 경우 MBus_Address 별로 한건씩 나오는데
아마도 읽는 순서대로 MBus_Address 별로 최초로 나오는 행을 가져오는 듯 합니다.
그래서 최신 자료를 조회하기 위해 서브쿼리에서 정렬을 수행한게 아닐까? 생각되네요.
최신자료를 조회하기 위한 쿼리가 맞다면?
정렬이나 그룹바이 구문이 틀린건 아닌 것 같구요.
조회 성능이 나오지 않는 것은
검색이나 조인 컬럼에 대한 인덱스가 적절한지 확인해야 하구요.
실행계획도 확인해 보시면 좋습니다.
정렬부하를 줄이기 위해서는 * 대신 꼭 필요한 컬럼만 나열하는게 좋습니다.