본문 바로가기
IT 공부/SQL

[SQL튜닝] 조인 조건이 없는 조인

by 해모해모 2024. 3. 25.
728x90
반응형

[SQL튜닝] 조인 조건이 없는 조인


주요내용

  • CARTESIAN PRODUCT의 개념
  • 자주 사용하는 방법
  • CARTESIAN PRODUCT 적용 예제

학습목표

  • 조인 조건이 없는 SQL 문장의 조인에 대한 이해를 바탕으로 비효율적으로 수행되는 SQL문장을 진단할 수 있다.
  • 조인 조건이 없는 SQL문장의 조인을 활용하여 SQL문장을 성능목표에 부합하도록 개선할 수 있다.
  • 조인 조건이 없는 SQL문장의 조인의 활용을 통해 개선된 SQL문장이 성능목표에 부합하는지 테스트할 수 있다.

CARTESIAN PRODUCT의 개념

  • Cartesian Product가 발생하는 경우
    • WHERE절이 없는 조인 수행
    • 조인을 위한 조건 없이 조인 수행
  • '데이터 복제'라는 개념을 위해서 사용하지만, 잘못 사용하게 되면 오히려 데이터를 부풀리는 원인이 되기 때문에 퍼포먼스를 오히려 나쁘게 할 수도 있음

자주 사용하는 방법

  • COPY_T, IMSI_T, DUMMY_T와 같은 temporary Table을 활용함
  • DUAL을 활용함
  • 타 SQL에서 사용하고 있는 Table 활용 및 ROWNUM을 사용함 -> 주로 MASTER성 테이블을 사용함

CARTESIAN PRODUCT 적용 예제

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
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);
SELECT a.ename, b.qtr,
       DECODE(b.qtr, 1, a.q1, 2, a.q2, 3, a.q3, a.q4) AS sl
FROM (SELECT ename, 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;
WITH mytab AS(
    SELECT ename, q1, q2, q3, q4
    FROM emp_sal)
  SELECT ename, grp AS qtr, no
  FROM mytab
  UNPIVOT(no FOR grp IN (q1 AS 1,
                          q2 AS 2,
                          q3 AS 3,
                          q4 AS 4))
  ORDER BY ename;
-- EC_DAY(일자관리 테이블)
-- DAY /* 일자(01~31) */
SELECT ymd
FROM (SELECT '2017'||a.day||b.day AS ymd,
             TO_CHAR(LAST_DAY(
                TO_DATE('2017'||a.day, 'YYYYMM')), 'YYYYMMDD') AS eday
      FROM ec_day b, ec_day a
      WHERE a.day <= '12')
WHERE ymd <= eday;
728x90
반응형

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

[SQL튜닝] SUBQUERY와 함수의 활용  (0) 2024.03.25
[SQL튜닝] SORT/MERGE/HASH JOIN  (0) 2024.03.19
[SQL튜닝] NESTED LOOPS JOIN  (0) 2024.03.19
[SQL튜닝] 인덱스 활용이 불가능한 경우  (2) 2024.03.13
[SQL튜닝] 결합인덱스  (0) 2024.03.12

댓글