top10의 결과가져오기
kwindow2 1학년

답변 채택시 : 0코아

답변 1 추천 0 조회 139 2017.07.17
안녕하세요 
아래과 같이 조건에 맞는 data의 10건을 최대한 빨리 가져오고 싶습니다.


SELECT    A.RNUM
       A.DMCY_INACT_STD_ID  ,
       B.DMCY_INACT_STD_NM  ,
       A.CDNO ,
       A.CELNO ,
       A.DMCY_DV_CD ,

       A.TCC_DV_CD     
  FROM (SELECT   ROW_NUMBER() OVER(
                 ORDER BY NVL(X.CDNO, ' ') DESC) RNUM ,
               X.DMCY_INACT_STD_ID ,
               X.CDNO ,
               X.CELNO ,
               X.USR_REG_DTTI ,
               X.CD_ACTL_BAM ,
               X.CD_ACTL_BAM_UPT_DTTI ,
               X.DMCY_DV_CD ,
               X.TCC_DV_CD
          FROM TB_DMCY X
         WHERE X.DMCY_INACT_STD_ID = '201612DM00005'
           AND SCHDR_EXEC_DT BETWEEN SUBSTR('20170301', 1, 6)||'01' AND SUBSTR('20170301', 1, 6)||'31'
           ) A ,  -- inline view
       mobown.TB_INACT B
 WHERE A.DMCY_INACT_STD_ID = B.DMCY_INACT_STD_ID
   AND A.RNUM BETWEEN 1 AND 10  -- inline view 10건을 가져오고 싶음
 ORDER BY A.RNUM ;
댓글 (0)
목록 답변등록
top10의 결과가져오기
jhchoi 2017.07.25

SELECT 된 결과 건수가 크고 이를 정렬해서 10건만 빠르게 가지고 오고자 한다면 부분범위 처리로의 유도밖에는 방법이 없습니다.  아래는 인덱스를 이용하여 정렬을 대체함으로써 부분범위 처리로 유도하기 위한 예입니다.  실행계획을 확인하여 원하는대로 부분범위 처리로 잘 유도가 되는지 확인이 필요합니다.


만약, TB_DMCY 테이블에서 WHERE 조건에 해당하는 데이터 건수가 매우 많고, TB_INACT 테이블과 조인된 결과는 많지 않은 경우는 아래와 같이 부분범위 처리로 유도하더라도 성능이 좋지 않을 수 있습니다.
이런 경우는 TB_DMCY 테이블을 읽기 전에 인덱스만 액세스하여 TB_INACT 테이블과 조인한 결과를 추출한 후
다시 TB_DMCY 테이블을 액세스하는 방법으로 인덱스와 SQL을 수정해야 합니다.
여기서는 이 방법까지는 설명드리진 않겠습니다.



1. TB_DMCY 테이블에 인덱스 생성 (Function-based Index)
   TB_DMCY_IX1 :  DMCY_INACT_STD_ID + NVL(CDNO, ' ') + SCHDR_EXEC_DT



2. SQL 수정


SELECT  /*+ ORDERED USE_NL(B) */               ----> 추가
        ROWNUM    RNUM                         ----> 수정
        A.DMCY_INACT_STD_ID  ,
        B.DMCY_INACT_STD_NM  ,
        A.CDNO ,
        A.CELNO ,
        A.DMCY_DV_CD ,
        A.TCC_DV_CD    
  FROM (SELECT /*+ INDEX_DESC(X TB_DMCY_IX1) */              ----> 추가 (위에서 추가한 인덱스명)
                --ROW_NUMBER() OVER(                         ----> 삭제
                --ORDER BY NVL(X.CDNO, ' ') DESC) RNUM ,     ----> 삭제
               X.DMCY_INACT_STD_ID ,
               X.CDNO ,
               X.CELNO ,
               X.USR_REG_DTTI ,
               X.CD_ACTL_BAM ,
               X.CD_ACTL_BAM_UPT_DTTI ,
               X.DMCY_DV_CD ,
               X.TCC_DV_CD
          FROM TB_DMCY X
         WHERE X.DMCY_INACT_STD_ID = '201612DM00005'
           AND SCHDR_EXEC_DT BETWEEN SUBSTR('20170301', 1, 6)||'01' AND SUBSTR('20170301', 1, 6)||'31'
         ORDER BY  NVL(X.CDNO, ' ') DESC                          ----> 추가   
           ) A ,  -- inline view

       mobown.TB_INACT B
 WHERE A.DMCY_INACT_STD_ID = B.DMCY_INACT_STD_ID
   --AND A.RNUM BETWEEN 1 AND 10  -- inline view 10건을 가져오고 싶음    ----> 삭제
   AND ROWNUM <= 10                                               ----> 추가 
 --ORDER BY A.RNUM ;                                              ----> 삭제        

댓글 (0)