안녕하세요.
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 로 바뀌어야 합니다.
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 구분코드, 시간대 ;