어디를 손봐야할지 ㅡㅡ 0 4 614

by 날아라! [MySQL] [2018.01.05 10:03:49]


안녕하세요. 고수님들께 조언을 구하고자 ㅜㅜ

지금 퇴사한 개발자의 업무를 이어받아서 소스를 분석하고있는데요.

 

사이트 이동속도가 너무느려 확인해보니.

현재 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

 

by 마농 [2018.01.08 08:29:34]

1. 그룹바이 사용법이 이상합니다.
2. 서브쿼리 안에서의 정렬은 불필요합니다.


by 날아라! [2018.01.08 16:37:11]

아...이제야 봤네요....마농님 답변감사합니다.

한가지만 더 여쭤봐도 될까요?

그렇다면 정렬이 필요할시는 서브쿼리가 아닌 밖에서 정렬을 시도하면되는건가요?


by 마농 [2018.01.08 16:59:55]

최종 정렬이 필요한 상황이라면 맨 마지막에 정렬하는게 맞구요.
중간 단계에서의 정렬은 마지막에 정렬이 흐트러질 가능성이 있으므로.
서브쿼리 안에서의 정렬은 무의미한 경우가 많긴 하지만...
서브쿼리 안에서의 정렬이 의미있는 경우도 물론 존재합니다.
위 구문을 다시 한번 살펴보니 정렬이 의미있는 구문일지도 모른다는 생각이 드네요.
mysql 에서만 가능한 그룹바이를 사용했는데 서브쿼리에서 정렬을 했습니다.
SELECT * FROM (...) GROUP BY MBus_Address;
이 구문의 경우 MBus_Address 별로 한건씩 나오는데
아마도 읽는 순서대로 MBus_Address 별로 최초로 나오는 행을 가져오는 듯 합니다.
그래서 최신 자료를 조회하기 위해 서브쿼리에서 정렬을 수행한게 아닐까? 생각되네요.

최신자료를 조회하기 위한 쿼리가 맞다면?
정렬이나 그룹바이 구문이 틀린건 아닌 것 같구요.
조회 성능이 나오지 않는 것은
검색이나 조인 컬럼에 대한 인덱스가 적절한지 확인해야 하구요.
실행계획도 확인해 보시면 좋습니다.
정렬부하를 줄이기 위해서는 * 대신 꼭 필요한 컬럼만 나열하는게 좋습니다.


by 날아라! [2018.01.09 11:15:39]

마농님의 지식에 감탄합니다^^

최신자료를 뽑아오는게 맞습니다.

결국 필요한컬럼과 인덱스를 잡아줘야하는 상황이군요^^

 

감사합니다.

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