SELECT YMDSEQ, MAX(REST6) REST6
FROM (SELECT B.YMDSEQ, B.YMD
, NVL(LENGTH(
REGEXP_REPLACE(
REGEXP_REPLACE(
REPLACE(
wm_concat(NVL(A.HVAL,0)) OVER(ORDER BY B.YMDSEQ DESC, B.SEQ DESC
ROWS BETWEEN CURRENT ROW AND 47 FOLLOWING)
, ',')
, '0{6,}', 2)
, '[^2]')
), 0) REST6
FROM CREW_RT10 A,
CREW_RT04 B
WHERE B.VESSEL = A.VESSEL(+)
AND B.YMDSEQ = A.YMDSEQ(+)
AND B.SEQ = A.SEQ(+)
AND B.VESSEL = '0001'
AND A.CREW(+) = '100002'
AND B.YMD >= '20131201'
AND B.YMD <= '20140131'
) S
WHERE YMD >= '20140101'
AND YMD <= '20140131'
GROUP BY YMDSEQ
ORDER BY 1
예 맞습니다. 아웃조인도 있고 구문도 복잡합니다.
위내용의 테이블을 올려야 겠지요 지금은 좀 바빠서
감사합니다.
조언 감사합니다.
CREW_RT04 테이블 PRIMARY KEY (B.VESSEL, B.YMD, B.SEQ )
CREW_RT10 테이블 PRIMARY KEY(A.VESSEL, A.YMDSEQ, A.SEQ, A.CREW) 되어있고요
질문1 만약에 CREW_RT04 테이블를 조인할때 B.SEQ 를 빼고 B.VESSEL, B.YMD 칼럼으로 하면 인텍스를 타나요. 안타다면 B.VESSEL, B.YMD 두 칼럼을 묶어서 인텍스를 새로 생성해야하나요???
기타 항목들(B.YMDSEQ, B.SEQ, A.HVAL)의 인덱스는 없습니다..
질문2)
wm_concat(NVL(A.HVAL,0)) OVER(ORDER BY B.YMDSEQ DESC, B.SEQ DESC
ROWS BETWEEN CURRENT ROW AND 47 FOLLOWING)
desc 해서 연속된 값을 검색을 해서요 20140101 데이터는 201312 월 데이터와 연계해서
자료를 뽑아야 해서요. 다른 방법이 있을까요???
확실히 조인을 빼고 CREW_RT10 테이블 단독으로 하니깐 속도가 좋네요.
인덱스 스캔을 하기에 충분한 인덱스 구조입니다.
굳이 조건을 아무 이유 없이 빼거나
기존 인덱스에 포함되는 작은인덱스를 만들 필요는 없구요.
인덱스를 잘 탔는지? 실행계획 확인이 필요합니다.
각 테이블의 전체 건수 및 조건에 맞는 건수 확인이 필요하겠네요.
건수가 많아지면 인덱스가 불리해 집니다.
인덱스 스캔 후 테이블을 읽는 랜덤엑세스 과정 때문입니다.
이 과정을 없애려면 필요한 항목이 모두 인덱스에 있으면 됩니다.
이때는 기타 항목들을 포함한 인덱스 추가 생성을 검토하셔야 합니다.
(B.VESSEL, B.YMD, B.SEQ, B.YMDSEQ)
(A.VESSEL, A.YMDSEQ, A.SEQ, A.CREW, A.HVAL)