Backend 개발자/StackOverflow

Mssql OUTER APPLY 언제쓰나요? OneToOne 테이블 구조에서 통계 SUM count GroupBy 대신 OUTER APPLY 처리하기

by 앵과장 2022. 12. 9. 16:11
반응형

최근 회사에서 전략과제를 진행하고있는데 시스템 DB 두가지 모두 대량에 트래픽 경험이 없는 회사라서 그런지 

단순한 테이블 구조로 나올수있을것같은데 복잡하게 만들어 공유 되고있다보니

... 덕분에 다양한 mssql 에서 제공하는 테이블 관계 함수를 사용하고있어서 공유합니다.

 

컨텐츠 와 컨텐츠 집계 테이블

컨텐츠 테이블 그리고 컨텐츠 클릭시 카운터 증가되는 테이블이 있다고 가정하겠습니다.

 

contents

id subject description regDate
1 컨텐츠A 상세설명A 2022-01-02 10:00:00
2 컨텐츠B 상세설명B 2022-01-03 10:00:00
3 컨텐츠C 상세설명C 2022-01-04 10:00:00

aggregate

id count type
1 1 mobile
1 3 pc

 

해당 쿼리처럼 group by 와 sum을 이용해서 컨텐츠에 해당하는 집계 Row count 를 가져올수도 있고 

SELECT
    T1.id,
    T1.subject,
    T1.description,
    T1.regDate,
    ISNULL(SUM(T2.count),0) as count
FROM contents T1
LEFT JOIN aggregate T2 ON T1.id = T2.id
GROUP BY T1.id,T1.subject,T1.description,T1.regDate

OUTER APPLY 이용해서 처리가능합니다.

SELECT
    T1.id,
    T1.subject,
    T1.description,
    T1.regDate,
    T3.count  
FROM contents T1
OUTER APPLY(
    SELECT ISNULL(SUM(T2.count),0) as count
    FROM aggregate T2
    WHERE T1.id = T2.id
    AND T2.type IN ("mobile","pc")
) T3

성능만 보면 group by가 빠를것같긴한데 

Syntax 와 분리된 Query 코드레벨로 보면 아래처럼 처리하는것이 좀더 눈으로 보기에는  편한방법인것 같습니다.

 

운영하다보면 성능보다 직관적인 쿼리로 구성하는것이 더좋을때도 있기때문에

사용하면서 관리가 용이한 방법으로 진행해 보시기 바랍니다.