현업에서 group by에 대한 쿼리 튜닝으로 pivot를 사용하는 것을 봤다.
pivot이 group by이상의 성능은 발휘하는것로 보인다.
● PIVOT 사용
SELECT * FROM
( SELECT DEPT ,MGR, SAL FROM EMP )
PIVOT
( SUM(SAL) AS TOTAL FOR MGR IN ( '부장' AS 부장, '차장' AS 차장, '과장' AS 과장)
● PIVOT 대신 GROUP BY 사용
SELECT
DEPT
,SUM( DECODE( MGR , '부장', SAL)) AS 부장_TOTAL
,SUM( DECODE( MGR , '차장', SAL)) AS 차장_TOTAL
,SUM( DECODE( MGR , '과장', SAL)) AS 과장_TOTAL
FROM ( SELECT DEPT, MGR , SUM(SAL) SAL AS TOTAL FROM EMP GROUP BY DEPT, MGR )
GROUP BY DEPT;
● UNPIVOT 사용
SELECT * FROM
( SELECT PROJECTID , MANAGER, WORKER FROM WORK_TBL )
UNPIVOT INCLUDE NULLS
( COLVAL FOR COLNAME IN ( MANAGER, WORKER) )
ORDER BY PROJECTID;
● UNPIVOT 대신 데이터 복제 사용
SELECT
A.PROJECTID
,DECODE(B.LVL, 1, 'MANAGER', 2, 'WORKER') AS COLNAME
,DECODE(B.LVL, 1, A.MANAGET, 2, A.WORKER) AS COLVAL
FROM WORK_TBL A, ( SELECT LEVEL AS LVL FROM DUAL CONNECT BY LEVEL <=2 ) B
ORDER BY A.PROJECTID