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 |
댓글