검색 속도 개선 0 6 1,181

by 커피향 [2014.08.01 15:26:58]


select aa, max(bb)
  from (select  aa, bb
          from t
       ) s
 group by aa
 order by aa

하위질의 t 테이블 검색결과 2000 이상 레코드가 검색되고
  s 로 감싸고 group by하고 order by 하면
 검색속도가 상당히 떨어지군요.
혹시 검색 속도를 개선할 방법이 있을까요?
(s 안에서 group by 못하는 경우)
답변 부탁드립니다.

by 마농 [2014.08.01 15:33:16]

겨우 2000건에 느릴리가 없는 구문이지요.
문제는 실제 구문이 위와 같지 않을 거라는 거죠.
아마도 서브쿼리 안쪽 구문이
 - 상당히 복잡하거나?
 - 조인을 포함하거나?
 - 조건이 주어지거나?
할 것 같습니다.
위와 같이 단순하게 올려주신 SQL 에는 비효율이 전혀 없고 개선할 것도 없습니다.


by 커피향 [2014.08.01 16:40:18]

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

예 맞습니다. 아웃조인도 있고 구문도 복잡합니다.

위내용의 테이블을 올려야 겠지요  지금은 좀 바빠서

감사합니다.

 


by 마농 [2014.08.04 10:37:20]

검색 조건(B.VESSEL, B.YMD) 및 조인 조건(A.VESSEL, A.YMDSEQ, A.SEQ, A.CREW)에
인덱스가 있는지 확인해 볼 필요가 있겟네요.
기타 항목들(B.YMDSEQ, B.SEQ, A.HVAL)의 인덱스 여부.
전체 건수 및 조건에 맞는 건수도 확인해 보시구요.


기타..
현재행부터 47행 뒤까지를 분석함수를 통해 합산처리하는데...
12월부터 조회할 이유가 전혀 없네요.
1월부터 조회해도 결과는 같겠네요.
과거자료 추가조회는 아무런 의미가 없으며
오히려 미래자료를 추가로 조회해야 할듯 하네요.


by 커피향 [2014.08.04 11:19:30]

조언 감사합니다.

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 테이블 단독으로 하니깐 속도가 좋네요.


by 마농 [2014.08.04 12:32:08]

인덱스 스캔을 하기에 충분한 인덱스 구조입니다.
굳이 조건을 아무 이유 없이 빼거나
기존 인덱스에 포함되는 작은인덱스를 만들 필요는 없구요.
인덱스를 잘 탔는지? 실행계획 확인이 필요합니다.
각 테이블의 전체 건수 및 조건에 맞는 건수 확인이 필요하겠네요.
건수가 많아지면 인덱스가 불리해 집니다.
인덱스 스캔 후 테이블을 읽는 랜덤엑세스 과정 때문입니다.
이 과정을 없애려면 필요한 항목이 모두 인덱스에 있으면 됩니다.
이때는 기타 항목들을 포함한 인덱스 추가 생성을 검토하셔야 합니다.
(B.VESSEL, B.YMD, B.SEQ, B.YMDSEQ)
(A.VESSEL, A.YMDSEQ, A.SEQ, A.CREW, A.HVAL)


by 커피향 [2014.08.04 17:12:11]

유용한 조언 감사합니다.

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