통계관련 질문 0 5 564

by 날아라! [MySQL] [2018.09.12 14:15:15]


안녕하세요. 

현재 골프장관련 시세프로그램을 작업하고있는데요. 

막히는 부분이 있어 고수님들께 문의 / 조언을 구하고자합니다.



SELECT ws.region        -- 지역코드
     , ws.leisureCode    -- 골프장명
     , ws.gubun        
     , ws.membership_name    -- 회원권명
     , ws.prev_date        -- 전주날짜
     , ws.prev_price    -- 전주시세
     , ws.today_date    -- 금주날짜
     , ws.today_price    -- 금주시세
FROM sise ws
LEFT JOIN membership wm
ON ws.membership_name = wm.membership_name 
WHERE wm.info_open != 'N' AND wm.pcode <> ''
  AND ws.today_date between '20180905' and '20180912'
ORDER BY membership_name ASC

위와같은 쿼리문이 있는데요.

위 기간안에서 전주시세 및 금주시세의 평균값을 구하고자하는데.

기본적인 지식인 while문을 통해 추출을 해봤지만 정상적으로 값이 나오긴 하는데

속도가 상당히 느리네요.

WHILE문안에는 아래와 같은 쿼리문이 들어가있습니다.

// 금주

SELECT SUM(ws.today_price) today_price,COUNT(ws.today_price) cnt
    FROM sise ws
    WHERE ws.membership_name = 'A골프장'
    AND ws.today_date between '20180905' and '20180912'

// 전주

SELECT SUM(ws.today_price) today_price,COUNT(ws.today_price) cnt
    FROM sise ws
    WHERE ws.membership_name = 'A골프장'
    AND ws.today_date between '20180822' and '20180829'

속도개선을 위한 쿼리문을 조정할수있는 방법이 있는지 조언부탁드립니다.

 

by 창조의날개 [2018.09.12 17:28:54]
SELECT ws.region        -- 지역코드
     , ws.leisureCode    -- 골프장명
     , ws.gubun        
     , ws.membership_name    -- 회원권명
     , ws.prev_date        -- 전주날짜
     , ws.prev_price    -- 전주시세
     , ws.today_date    -- 금주날짜
     , ws.today_price    -- 금주시세
     , ws_a.today_price  --금주합계
     , ws_a.cnt          --금주수량
     , ws_b.today_price  --전주합계
     , ws_b.cnt          --전주수량
FROM sise ws LEFT JOIN membership wm
  ON ws.membership_name = wm.membership_name 
LEFT JOIN (SELECT ws.membership_name, SUM(ws.today_price) today_price,COUNT(ws.today_price) cnt
            FROM sise ws
            WHERE ws.today_date between '20180905' and '20180912'
            GROUP BY ws.membership_name) ws_a
  ON ws.membership_name = ws_a.membership_name 
LEFT JOIN (SELECT ws.membership_name, SUM(ws.today_price) today_price,COUNT(ws.today_price) cnt
            FROM sise ws
            WHERE ws.today_date between '20180822' and '20180829'
            GROUP BY ws.membership_name) ws_b
  ON ws.membership_name = ws_b.membership_name 
WHERE wm.info_open != 'N' AND wm.pcode <> ''
  AND ws.today_date between '20180905' and '20180912'
ORDER BY membership_name ASC
;


-- 지문에는 평균이라고 하시고 샘플쿼리는 합계와 수량이네요.
-- 이부분은 적당히 수정해서 사용하시면 될 듯 합니다.

 


by 날아라! [2018.09.13 09:04:32]

창조의 날개님 답변감사합니다.

다른작업을 하느라 이제야 봤네요..

조언주신 방식대로 테스트를 해보았으나 속도가 더 느려지네요 ㅡㅡ

관심가져 주셔서 감사합니다.^^ 다른방법으로 해야될듯싶어요...


by 우리집아찌 [2018.09.13 09:20:04]

membership_name 에 INDEX 가 없지 않을까 합니다.

날개님이 보여주신건 예제고 membership_CODE 같은게 존재하리라 생각됩니다.

group by 와 join 에서 membership_name => membership_CODE(가칭)

으로 바꾸어 줘보세요.

아니면 SUM() OVER() , COUNT() OVER() 함수로 가능할것 같습니다.


by 창조의날개 [2018.09.13 09:49:04]

속도가 느리다면 sise테이블에 today_date, today_price 순서로 컬럼 2개를 인덱스로 하나 만들어 보시면 어떨까 합니다.

그리고 ws.today_date between '20180905' and '20180912' 기준으로 로우수가 얼마나 돼나요?

만약 로우수가 너무 많다면 주별로 집계 테이블을 따로 만들어 쓰시는게 좋을 듯 합니다.

주별로 안되면 일별로 해서 7일치만 sum하는 방향으로 ...


by 날아라! [2018.09.13 09:32:20]

아찌님 감사합니다.^^ membership_name에 대한 인덱스는 잡혀있습니다.

또한 별도의 membership_CODE 같은건 존재하지 않습니다.

조언대로 한번 시도해볼께요^^

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