검색을 통해 답을 얻지못해 질문드립니다. (서브테이블 합계) 0 6 3,004

by DJ메탈짱™ [PL/SQL] 합계 서브쿼리 [2009.11.17 23:55:24]


    select a, b, c, d, (
        select sum(sale_amt) from BHCHOI_CREATE
        where groupid in (     
            select groupid
            FROM BHCHOI_CREATE --> 매출정보
            where ID_I = a.id_i 
                AND LAST_SALE_DATE BETWEEN '20061201' AND '20061210'
        )        
    ) as "총 매출액"
    FROM bhchoi_create2 a --> 아이디정보

위 쿼리 보시면 이해가 되실것으로 생각되지만....
약간의 설명을 드리자면,
아이디정보 테이블에서 해당되는 사람의 매출의 합계를 구하고자 함인데...

매출정보에서 해당기간에 포함되는 아이디의 groupid 를 빼와서 그에 해당되는 매출액의 합계를
아이디 조회시 확인하고 싶은 것입니다.
그래서 위와 같이 해보려고 하는데 성능상에 문제가 있을까요?

개선의 여지가 있다면 조언좀 부탁드립니다....

 

by 꼬랑지 [2009.11.18 08:52:47]
SELECT A,B,C,D
,SUM(SALE_AMT) OVER() "총매출액"
FROM BHCHOI_CREATE2 A,BHCHOI_CREATE B
WHERE A.ID_ID=B.ID_ID
AND B.LAST_SALE_DATE BEWTEEN '20061201' AND '20061210'


그런데 아이디정보의 ID_I 와 매출정보의 GROUPID가 어떤 관계인지 설명이 없네요. 아이디정보에 있는 사람들이 발생시킨 매출액의 합을 구하는데 굳이 GROUPID를 찾기 위해 스칼라서브쿼리에서 BHCHOI_CREATE 테이블을 두번 접근한 이유가 궁금하네요. 그리고 아이디정보 테이블에서 조회하는 A,B,C,D라는 칼럼의 정체도 궁금하고...

by finecomp [2009.11.18 13:42:39]
꼬랑지님 글처럼 조인으로 푸세요~~
성능면에서 하나 덧 붙이자면 아이디정보의 총 row수가 1000rows라면
총매출액을 구하는 쿼리를 1000번 수행하면서 parsing, excute, fetch, grouping 등의 추가작업들을 1000번씩 하게 됩니다.

Scalar Subquery는 주로 코드성데이터처럼 소량의 data cache가 용이한 정도의 데이터들을 가져오는데 쓰는 경우 조인보다 성능효율이 좋아집니다.
a.id_i가 같은 값이 들어오는 경우가 거의 없을 것으로 보이므로 위 요건은 paging으로 부분범위를 가져오는 것이 아니고 전체데이를 가져온다면 조인으로 작성하는 것이 맞을 듯 싶습니다...;

by finecomp [2009.11.18 13:46:04]
그리고 같은 성격의 집합을 가져올 때는 최대한 한번만 access하여 가져오는 것이 성능의 기본정석입니다...;

by finecomp [2009.11.18 14:00:23]
select a,b,c,d
, b.sal_amt
from bhchoi_create2 a --> 아이디정보
,
(select id_i, sum(sale_amt) AS sal_amt
from BHCHOI_CREATE
where groupid IS NOT NULL
and LAST_SALE_DATE BETWEEN '20061201' AND '20061210'
group by id_i
) b --> 매출정보
where a.id_d = b.id_d(+)
하면 위 쿼리와 같은 결과를 얻을 수 있을 겁니다.

왜 is not null 조건이 들어같는지, 아우터조인 사인이 붙었는지는 잘 생각 해 보시길...;

by finecomp [2009.11.18 14:02:37]
오타네용...;
id_d => id_i

by DJ메탈짱™ [2009.11.18 23:37:41]
꼬랑지//
궁금해하시는 컬럼은...임의로 보여주기위해 붙인 값입니다..ㅜ.ㅜ
제거해도 되는 값이구요. groupid는 유일한 사람을 판단하기 위한 컬럼이라고 보시면 되는데...흠~ 업무상 사용되는거라 말로 설명하기가 어렵네용~~ ㅜ.ㅜ join으로 가닥을...

finecomp//
아...scalar subquery는 그런 경우에만 사용해야 하는거군요. 핵심은 여러번의 subquery로 수행하지 않도록... 추가작업들의 간소화를 위해 합계낸 결과 자체를 join하는 것이군요....

두분모두 감사드립니다.
두분께서 조언해주신 부분에 대해 응용하여 적용해봐야겠네요~ 감사합니다 (__)
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입