안녕하세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | WITH 연동스케줄 AS ( SELECT 'N0001' 구분코드, '08,09,10,11,12,13,14,15,16,17,18,19,' 동작시간대 FROM DUAL UNION SELECT 'N0002' , '08,09,10,11,12,13,14,15,16,17,18,19' FROM DUAL UNION SELECT 'N0003' , '08,09,10,11,12,13,14,15,16,17,18,19' FROM DUAL UNION SELECT 'N0004' , '08,09,10,11,12,13,14,15,16,17,18,19' FROM DUAL) SELECT * FROM ( SELECT DISTINCT 구분코드, TRIM(REGEXP_SUBSTR(동작시간대, '[^,]+' , 1, LEVEL )) AS 시간대 FROM 연동스케줄 CONNECT BY INSTR(동작시간대, ',' , 1, LEVEL - 1) > 0 ) |
N0001, N0002 2개만 있을 때는 빠르고 3개까지 있으면 7초정도
4개부터 분단위로 엄청 오래걸립니다. 왜 그런것인가요?
감사합니다.
CONNECT BY LEVEL <= n 를 이용한 행 복제 방식은
dual 과 같이 1건 자료에 적용되는 방식입니다.
여러건의 자료에 그대로 적용하게 되면 엄청난(기하급수) 행복제가 발생됩니다.
이렇게 사용하면 안됩니다.
http://gurubee.net/article/55635
번외로
UNION 은 UNION ALL 로 바뀌어야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | WITH 연동스케줄 AS ( SELECT 'N0001' 구분코드, '08,09,10,11,12,13,14,15,16,17,18,19' 동작시간대 FROM dual UNION ALL SELECT 'N0002' , '08,09,10,11,12,13,14,15,16,17,18,19' FROM dual UNION ALL SELECT 'N0003' , '08,09,10,11,12,13,14,15,16,17,18,19' FROM dual UNION ALL SELECT 'N0004' , '08,09,10,11,12,13,14,15,16,17,18,19' FROM dual ) SELECT 구분코드 , REGEXP_SUBSTR(동작시간대, '[^,]+' , 1, lv) 시간대 FROM 연동스케줄 a , ( SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 24) b WHERE lv <= REGEXP_COUNT(동작시간대, '[^,]+' ) ORDER BY 구분코드, 시간대 ; |