1. Cartesian Product의 개념

곱집합 연산을 생각하면 된다.
특정 테이블의 데이터를 필요한 만큼 복사(copy) 하기 위한 방법

Cartesian Product 예시

* Cartesian Product가 발생하는 경우
- WHERE 절이 없는 조인 수행
- WHERE 절은 있으나 테이블 조인을 위한 조건 없이 조인을 수행

* '데이터 복제'라는 개념을 활용하기 위해 사용하지만, 잘못 사용하게 되면 오히려 데이터를 부풀리는 원인이 되기 때문에 퍼포먼스를 오히려 나쁘게 할 수 있다. 

 

 

2. 사용하는 방법

 
위 그림에서 ?에는 Table이 올수도, View가 올수도 있다.

 

Cartesian Product는 아래 3가지 방법 중에 하나를 선택하여 사용한다.
① COPY_T, IMSI_T, DUMMY_T 와 같은 temporary Table을 활용함
(Cartesian product 만을 위한 전용 테이블을 생성해서 사용)
② DUAL과 같은 dummy 테이블을 사용
③ 타 SQL에서 사용하고 있는 Table 활용 및 ROWNUM을 사용한다. (주로 Master 테이블을 사용)

 

3. Cartesian Product 적용 예제
- UNION으로 연결된 각각의 SQL이 읽고 있는 데이터가 전부 같을 경우, 데이터 복제와 같은 개념을 활용하기 위해 사용
- 데이터 구조 변환을 통해 사용자가 요청한 구조대로 데이터를 조회할 때 사용

ex)

SELECT '직군별' AS class, job, COUNT(*) AS cnt
FROM emp
GROUP BY job
UNION ALL
SELECT '부서별' AS class, TO_CHAR(deptno), COUNT(*)
FROM emp
GROUP BY deptno
UNION ALL
SELECT '총인원' AS CLASS, NULL, COUNT(*)
FROM emp

모두 emp 테이블을 참고하며, WHERE절이 없는 쿼리들을 UNION ALL 시킨 것.
각 SQL문이 읽어들이는 데이터가 같을 때, 데이터 복제를 통해 튜닝을 진행해야함.
(WHERE절이 있다면, WHERE절도 모두 같아야 한다).

Cartesian Product를 사용하면 아래 쿼리로 수정이 가능함.

 

SELECT DECODE(rn, 1, '직군별', 2, '부서별', '총인원') AS class

               DECODE(rn, 1, job, 2, deptno),

               SUM(cnt)

FROM (SELECT job, deptno, COUNT(*) AS cnt

             FROM emp

             GROUP BY job, deptno), 

            (SELECT ROWNUM AS rn

             FROM (SELECT LEVEL FROM dual CONNECT BY ROWNUM <=3 ))

GROUP BY rn, DECODE(rn, 1, '직군별', 2, '부서별', '총인원'), DECODE(rn, 1, job, 2, deptno);

-> 수정된 쿼리는 emp 테이블을 한 번만 읽은 효과가 있다.

 

그림처럼 변환하기 위해서는 아래와 같은 쿼리를 사용


SELECT  a.ename, b.qtr
DECODE(b.qtr, 1, a.q1, 2, a.q2, 3, a.q3, a.q4) AS sl
FROM (SELECT e.name, q1, q2, q3, q4, ROWNUM
 FROM emp_sal) a,
(SELECT ROWNUM AS qtr
 FROM (SELECT LEVEL FROM DUAL CONNECT BY ROWNUM <=4)) b
ORDER BY 1, 2;

 



'IT > SQL' 카테고리의 다른 글

Subquery  (0) 2023.07.25
SORT/MERGE JOIN과 HASH JOIN  (0) 2023.07.24
Nested Loop Join  (0) 2023.07.24
인덱스 활용이 불가능한 경우  (0) 2023.07.23
결합 인덱스(Composite Index)  (0) 2023.07.19

+ Recent posts