by 손님 [2013.04.01 15:24:26]
약 2000만 건 정도의 row가 있고,
이것들에 대해 특정 컬럼을 기준으로 grouping 및 컬럼 pivoting(한 개의 컬럼에 우측으로 concat)을 진행하려 합니다.
진행 중에,
약 5000 여 개의 row들이 한 개의 row로 pivot 되어야 하는 상황이 발생 했는데요,
기존에 사용하던 decode방식으로는 안 되는 것 같습니다.
PL/SQL 내에서 커서 돌리면서 CLOB변수에 concat하면서 처리하는 방법이 있을 것 같은데,
2000만 건에 대한 커서는 너무 오래 걸릴 것 같습니다.
혹시 좋은 방법이 있을까요?
고수님들의 답변 부탁 드리겠습니다.
감사합니다.
저는 위 쿼리 잘 실행됩니다.
0.026초 걸리네요~
설마 버전 문제일까요?
참고로 제가 사용하는 시스템의 버전은 아래와 같습니다.
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
"CORE 11.2.0.2.0 Production"
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
감사합니다~
WITH TAB AS ( SELECT COD ,LPAD(COD + LVL,5) VAL FROM ( SELECT 10000 COD FROM DUAL UNION ALL SELECT 20000 COD FROM DUAL UNION ALL SELECT 30000 COD FROM DUAL ) ,( SELECT LEVEL LVL FROM DUAL CONNECT BY LEVEL <= 5000 ) ) -- 묶음 처리했습니다. -- WM_CONCAT, LISTAGG 가 안되어서 XMLAGG 사용 -- (5:칼럼크기 + 1:구분자) * 5,000:최대ROW수 = 30,000:CONCAT한크기 -- 30,000 / 4,000:VARCHAR2크기 = 7.5 , 여유있게 10 묶음 처리 SELECT COD ,TO_CLOB(MAX(DECODE(NTL, 1 ,SUBSTR(VAL,2)))) || TO_CLOB(MAX(DECODE(NTL, 2 ,VAL))) || TO_CLOB(MAX(DECODE(NTL, 3 ,VAL))) || TO_CLOB(MAX(DECODE(NTL, 4 ,VAL))) || TO_CLOB(MAX(DECODE(NTL, 5 ,VAL))) || TO_CLOB(MAX(DECODE(NTL, 6 ,VAL))) || TO_CLOB(MAX(DECODE(NTL, 7 ,VAL))) || TO_CLOB(MAX(DECODE(NTL, 8 ,VAL))) || TO_CLOB(MAX(DECODE(NTL, 9 ,VAL))) || TO_CLOB(MAX(DECODE(NTL,10 ,VAL))) VAL FROM ( SELECT COD ,NTL ,SUBSTR(XMLAGG(XMLELEMENT(V ,',' ,VAL) ORDER BY VAL).EXTRACT('//text()') ,1) VAL FROM ( SELECT COD ,VAL ,NTILE(10) OVER (PARTITION BY COD ORDER BY VAL) NTL FROM TAB ORDER BY COD ,VAL ) GROUP BY COD ,NTL ) GROUP BY COD