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