오라클 첫번째는 빠르고 두번째 부터는 30초정도 걸려요 1 5 4,278

by 엔케이 [SQL Query] 오라클 두번째 속도 between [2016.08.09 17:53:21]


안녕하세요

쿼리에 대해 많은정보만 얻어가다가 처음질문드립니다.

 

SELECT * 
FROM (SELECT V.* 
          , ROW_NUMBER() OVER(ORDER BY MAKEDATE DESC) AS RNUM
       FROM (
           
SELECT     
          A.VIDEO_VIDEOGBN ||'_'|| A.VIDEO_VIDEOID ||'_'|| B.CLIP_VIDEODTL AS PK
        , B.CLIP_SUBJECT AS TITLE
        , NVL(DECODE(TRIM(A.VIDEO_MAKEDATE), '', '19000101'), '19000101') AS MAKEDATE
        , ROUND((B.CLIP_CLIPEND - B.CLIP_CLIPSTART)/1000)  AS PLAY_TIME
        , TO_CHAR(A.INSERT_DATE, 'YYYY-MM-DD')  AS INSERT_DATE       
FROM MAST_VIDEO_HEAD A
    LEFT OUTER JOIN
    MAST_VIDEO_TAIL B ON A.VIDEO_VIDEOSRCGBN = B.VIDEO_VIDEOSRCGBN
                     AND A.VIDEO_VIDEOGBN    = B.CLIP_VIDEOGBN
                     AND A.VIDEO_VIDEOID     = B.VIDEO_VIDEOID
                     AND B.CLIP_USEGBN       = 'Y' AND A.VIDEO_USEGBN='Y'
WHERE A.VIDEO_VIDEOSRCGBN  = 'KV' AND A.VIDEO_VIDEOGBN IN ('DH','DP','DK','DT','MH')
      AND B.CLIP_VIDEODTL  > 0

) V 
) WHERE RNUM BETWEEN 1 AND 10                    
;

 

위의 쿼리를 실행시에는 1초 이내에 실행이 됩니다.

첫번째는 빠르고 두번째 부터는 30초씩 시간이 소요됩니다.

 

BETWEEN 문장을 빼면 바로바로 결과가 출력됩니다.

하지만 페이징 기능구현을 위해서 뺄수는 없는데 

이런경우는 처음이라 질문드립니다.

 

증상을 보이는 DB의 데이터를 덤프떠서 새로운계정에(테이블스페이스도변경) 임포트 했습니다.

새로운 계정도 동일한 증상을 보입니다. ㅠ

 

다른서버 (개발환경)에 임포트 했습니다. 새로운 환경에서는 속도저하없이 바로바로 결과가 출력됩니다.

 

설정의 차이같은데 모르겠습니다. ㅠㅠ

도움부탁드리겠습니다.

 

 

by Lonnie [2016.08.10 09:46:39]

select * /* (+ full Table Name parallel (CPU 스레드 수) */

...

 

이렇게 해서 해당 컴퓨터로 구현하여 쿼리 처리 속도 확인해 보세요.


by Kyle [2016.08.10 14:26:46]

혹시 원하시는 결과가 이거 아닌가요?

 

SELECT * 
FROM (
    SELECT PK, TITLE, MAKEDATE, PLAY_TIME, INSERT_DATE, ROWNUM AS RNUM
    FROM (
        SELECT    
            A.VIDEO_VIDEOGBN ||'_'|| A.VIDEO_VIDEOID ||'_'|| B.CLIP_VIDEODTL AS PK
            , B.CLIP_SUBJECT AS TITLE
            , NVL(DECODE(TRIM(A.VIDEO_MAKEDATE), '', '19000101'), '19000101') AS MAKEDATE
            , ROUND((B.CLIP_CLIPEND - B.CLIP_CLIPSTART)/1000)  AS PLAY_TIME
            , TO_CHAR(A.INSERT_DATE, 'YYYY-MM-DD')  AS INSERT_DATE       
        FROM MAST_VIDEO_HEAD A
            LEFT OUTER JOIN MAST_VIDEO_TAIL B 
                ON A.VIDEO_VIDEOSRCGBN = B.VIDEO_VIDEOSRCGBN
                AND A.VIDEO_VIDEOGBN    = B.CLIP_VIDEOGBN
                AND A.VIDEO_VIDEOID     = B.VIDEO_VIDEOID
                AND B.CLIP_USEGBN       = 'Y' AND A.VIDEO_USEGBN='Y'
        WHERE A.VIDEO_VIDEOSRCGBN  = 'KV' AND A.VIDEO_VIDEOGBN IN ('DH','DP','DK','DT','MH')
        AND B.CLIP_VIDEODTL  > 0
        ORDER BY MAKEDATE DESC
    ) V 
    WHERE ROWNUM < 10
) 
WHERE RNUM >= 1
;

 


by 탱 [2016.08.10 17:23:59]

조건을 만족하는 데이터 추출 후 아우터 조인을 수행하시는게 좀더 성능을

보장 받을 수 있습니다. 올려주신 쿼리는 모든 데이터에 대해서 아우터 조인을 수행하므로

성능이 저하될 것으로 예상됩니다.


by 파워간 [2016.08.11 17:13:47]

두번째가 더 느린경우는 뭐죠?? 궁금하네요..

옵트쪽에서 커서쉐어링이 force라면 플렌을 바꿀 수도 있어 보이긴하는데..

plan(sqltrace)를 확인하셔서 1,2을 확인하신 뒤 첫번째에 맞게 hint를 추가해서 사용하시면 괜찮을거 같은데..

 

 


by 마농 [2016.08.12 09:49:10]

아우터 조인을 했지만
 - 조건절에서 다시 걸러내고 있으므로
 - 아우터 조인은 무효입니다.
 - 이너조인으로 바꾸세요.

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