DB관련

[펌] Static SQL을 위한 무기[1] - Cartesian Product(카테시안 곱)

saltdoll 2017. 11. 2. 07:34
반응형

Cartesian Product란

Query의 From절에 2개 이상의 Table이 있고, 두 Table 사이의 유효한 Join 조건이 기술되어 있지 않은 경우에는 두 Table의 모든 행들이 무조건 결합하여 Table들에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것을 Cartesian Product(카테시안 곱)라고 한다.

말로 써놓으니 어려운 듯 하지만, 실제로는 크게 어려운 개념이 아니다.
아래의 예를 보자. 각 품목별 수량의 합계와 전체합계를 한꺼번에 구하는 Static SQL이다.

Select (Case tbl2.no1 When 1 Then tbl1.품목 Else ‘합계’ End), Sum(수량)
From Table1 tbl1, (Select 1 no1 From dual Union All Select 2 From Dual) tbl2
Group By (Case tbl2.no1 When 1 Then tbl1.품목 Else ‘합계’ End), tbl2.no1





tbl1의 결과값과 tbl2의 결과값 사이에 유효한 Join 조건이 기술되지 않았으므로 Cartesian Product가 일어나게 되며 위 그림은 이 과정을 거친 중간 결과집합을 보여주고 있다. 이 중간집합을 Group By하여 품목별 합계와 전체합계를 한 번에 구할 수 있는 것이다. 결과가 궁금하신 분들은 실제로 한 번 Test해보셔도 좋겠다.
(한가지 부언하자면, Oracle도 이전 Version에서는 Sort Group By를 채택하여 전체 합계가 맨 밑에 나왔지만, Hash Group By 실행계획으로 풀린다면 품목별 합계와 전체 합계의 순서가 뒤섞여 나오게 될 것이다. 이런 경우에는 Order By절을 추가하여 원하는 순서대로 바로 잡아주도록 하자[각주:1])

이러한 Cartesian Product는 Static한 SQL을 사용하기 위해 우리가 사용할 수 있는 중요한 무기 중 하나이며, 이전 포스트에서도 사용자의 입력을 여러 개로 구분하기 위해 Cartesian Product를 사용한 바 있다. 개념을 잘 이해하여 중요한 순간에 쓸 수 있도록 우리의 무기창고에 잘 넣어두도록 하자.

다음 포스트에서는 오늘 Query에서도 쓰였던 Case When문에 대해 써보도록 하겠다.



  1. Sort Group By란 Group By의 결과를 내기 위해 내부적으로 Sort를 사용하는 방식이다. 따라서, 결과값은 당연히 Group By절에 기술된 대로 Sort되어 나온다. 하지만, Hash Group By는 Sort를 사용하지 않고 Group By하게 되므로 결과값이 정렬되지 않는다.
 [본문으로]



출처: http://rtti.tistory.com/entry/Static-SQL을-위한-무기1-Cartesian-Product카테시안-곱 [막장개발자의 블로그]

반응형
도움이 되셨다면 하트모양의 "♡ 공감"을 눌러주시면 큰 격려가 됩니다.
(로그인하지 않으셔도 가능)