왜 성능이 급격하게 저하가 되는건가요? 0 1 1,273

by 기린기린 [SQL Query] CONNECT BY REGEXP_SUBSTR [2020.01.29 17:03:31]


안녕하세요.

 

  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개부터 분단위로 엄청 오래걸립니다. 왜 그런것인가요?

감사합니다.

by 마농 [2020.01.29 17:21:42]

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 구분코드, 시간대
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입