정규식 표현으로 인한 속도 저하로 인하여 도움 요청 드립니다. 0 6 1,153

by 초봉 [SQL Query] [2022.10.12 10:23:09]


안녕하세요 정규식 표현으로 인한 속도 저하로 도움 요청 드립니다.

아래 내용은 하나의 id 값의 0000,0001,0002,0003 과 같이 들어가 있는 data를 row로 변환하는것을 짯는데 데이터들이 들어가니 조회 자체가 안됩니다.

row당 한 30개정도 들어가있고 총 한 60개 id값을 가지고 있는데.. 개선 하다하다가 안되어있네요 인덱스도 없고.. pk id 값 인덱스만 걸려있네요 도움 요청 드립니다.

SELECT 'A' AS ID
      ,
'0000,0001,0002,0003,0004,0005,0006,0007,0008,0009,0010,0011,0012,0013,0014,0015,0016,0017,0018'
   AS C_ID
FROM   DUAL
UNION ALL
SELECT 'B' AS ID
      ,
'0000,0001,0002,0003,0004,0005,0006,0007,0008,0009,0010,0011,0012,0013,0014,0015,0016,0017,0018'
   AS C_ID
FROM   DUAL


SELECT A.ID
FROM   (SELECT ID, C_ID
        FROM   ID_M
        WHERE  NEW_PATH IS NOT NULL AND C_ID IS NOT NULL) A
      , (SELECT     DISTINCT REGEXP_SUBSTR (AA.C_ID
                                           ,'[^,]+'
                                           ,1
                                           ,LEVEL)
                                C_ID
         FROM        (SELECT REPLACE (AAA.C_ID, ',', ',') C_ID
                     FROM    (SELECT ID, C_ID
                             FROM    ID_M
                             WHERE    NEW_PATH IS NOT NULL AND C_ID IS NOT NULL)
                            AAA) AA
         CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (AA.C_ID, '[^,]+', ''))
                             + 1) B
WHERE  INSTR (','
              || A.C_ID
              || ','
             ,','
              || B.C_ID
              || ',') > 0

도움 요청 드립니다 . 

by 마농 [2022.10.12 11:08:31]

1. 속도저하의 원인은
- 정규식 사용이 아닙니다.
- 잘못된 계층쿼리 사용입니다.
2.. CONNECT BY LEVEL <= n 를 이용한 행 복제 방식은
- dual 과 같이 1건의 자료에 적용하는 방식입니다.
- 여러건의 자료에 직접 적용하면 안됩니다.
- http://gurubee.net/article/55635
3. 두개의 테이블을 조인하는데? (sys_pgm_mgt, id_m)
- 조인 조건이 맞는지 의심이 드네요.
- c_id 만 사용하고 id 는 사용을 안하네요?
- 두 테이블이 각각 어떻게 생겼고? 
- 어떤 형태로 조인 결과가 나와야 하나요?


by 초봉 [2022.10.12 11:22:37]

SYS_PGM_MGT 는 -> ID_M 으로 변경을 해야 하며, 동일한 테이블 가지고 활용을 하고 있습니다.
조인결과 

A 0000

A 0001

A 0002

이하 생략 

위와 같이 ROW 형태로 나오면 됩니다.


by 마농 [2022.10.12 12:17:15]

"SYS_PGM_MGT 는 -> ID_M 으로 변경을 해야 하며, 동일한 테이블 가지고 활용을 하고 있습니다."
라는 말이 이해가 안갑니다.
말이 앞뒤가 안맞네요.


by 초봉 [2022.10.12 12:24:52]

테이블명을 잘못 썻습니다...SYS_PGM_MGT.. 명을 잘못 기입한 테이블 명입니다 ID_M  TABLE을 써야하는데 수정하면서 미처 수정을 못했내요 한테이블에 PK 컬럼 ID 기준으로 C_ID( 값 0001,0002,0003 을 ROW로 하려다보니 쿼리가 이상하게 짜진것 같습니다 ㅜㅜ 

A 0000

A 0001

A 0002


by 마농 [2022.10.12 12:47:08]
WITH id_m AS
(
SELECT 'A' id, 'x' new_path
, '0000,0001,0002,0003,0004,0005,0006,0007,0008,0009,0010' c_id
FROM dual
UNION ALL SELECT 'B', 'x', '0001,0003,0005,0007,0009' FROM dual
)
SELECT id
     , lv
     , SUBSTR(c_id, lv * 5 - 4, 4) c_id
  FROM id_m
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE new_path IS NOT NULL
   AND c_id     IS NOT NULL
   AND lv <= (LENGTH(c_id) + 1) / 5
 ORDER BY id, lv
;

 


by 초봉 [2022.10.13 09:23:57]

감사합니다.

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