DATOR


INLINE VIEW 사용시 MAIN SQL 의 조건 사용 튜닝[SQL]


★ INLINE 뷰 사용시 전체 집합을 GROUP BY 하여 MAIN SQL 과 JOIN 하는 경우 VIEW MERGE 가 일어날 수 있느 조건 있는지 확인해 볼 필요가 있습니다..

 

아래와 같은 SQL 의 경우.

 

SELECT A.CO_DVCD, A.MVEG_YMD, A.MVEG_SNO,

     A.GNTR_NO, A.OCR_YMD, NVL( A.MVEG_CNT, 0 ) MVEG_CNT

FROM               

   AA_MVOC_BKN A,

   AA_INCUSP_BKN B,

   AA_HTEG_UND_BKN C,

   AA_FARM_RLE_INF D,

   ( SELECT CO_DVCD, MVEG_YMD, MVEG_SNO,                                   

    NVL( SUM( FML_SIL_CNT ), 0 ) + NVL( SUM( ML_SIL_CNT ), 0 ) QTY

     FROM AA_CHKOUT_MST

     WHERE CO_DVCD = :ARG_COM_ID

     GROUP BY CO_DVCD, MVEG_YMD, MVEG_SNO ) E

WHERE A.CO_DVCD = :ARG_COM_ID

  AND C.HTCY_NO LIKE :ARG_HTCY || '%'

  AND C.HTCY_TPCD LIKE :ARG_TPCD || '%'

  AND B.INCU_YMD = :ARG_YMD

  AND A.CO_DVCD = B.CO_DVCD

  AND A.INCU_YMD = B.INCU_YMD

  AND A.INCU_SNO = B.INCU_SNO

  AND B.CO_DVCD = C.CO_DVCD

  AND B.HTEG_UND_YMD = C.HTEG_UND_YMD

  AND B.UND_SNO = C.UND_SNO

  AND C.FARM_RLE_NO = D.FARM_RLE_NO

  AND A.CO_DVCD = E.CO_DVCD(+)

  AND A.MVEG_YMD = E.MVEG_YMD(+)

  AND A.MVEG_SNO = E.MVEG_YMD(+)

 

INLINE VIEW 내부에 조건절이 없음으로 FULL TABLE SCAN 후 MAIN SQL 과 JOIN 하여 비효율이 발생하고 있습니다.

 

INLINE VIEW 는 A TABLE 과 JOIN 하고 있음으로 A TABLE 의 조건을 VIEW 내부에서도 사용할 수 있습니다.

 

아래와 같이 INLINE VIEW 내부에서 조회 범위를 확실하게 줄여 줄수 있는 조건을 사용함으로 비효율을 제거 할 수 있습니다.

 

SELECT B.CO_DVCD, E.MVEG_YMD, E.MVEG_SNO,
    E.GNTR_NO, E.OCR_YMD, NVL( E.MVEG_CNT, 0 ) MVEG_CNT
FROM                
  AA_INCUSP_BKN B,
  AA_HTEG_UND_BKN C,
  AA_FARM_RLE_INF D,
  ( 
    SELECT /*+ USE_NL (X Y) */Y.CO_DVCD, Y.MVEG_YMD, Y.MVEG_SNO,
               MAX(X.INCU_YMD) INCU_YMD, MAX(X.INCU_SNO) INCU_SNO,
               MAX(X.MVEG_CNT) MVEG_CNT, MAX(X.FML_OCR_CNT) FML_OCR_CNT, 
               MAX(X.SKCH_CNT) SKCH_CNT, NVL( SUM( Y.FML_SIL_CNT ), 0 ) +
               NVL( SUM( Y.ML_SIL_CNT ), 0 ) QTY
    FROM AA_MVOC_BKN  X, AA_CHKOUT_MST Y
    WHERE X.CO_DVCD = :ARG_COM_ID
           AND   X.INCU_YMD = :ARG_YMD
           AND   X.CO_DVCD = Y.CO_DVCD(+)
           AND   X.MVEG_YMD = Y.MVEG_YMD(+)
           AND   X.MVEG_SNO = Y.MVEG_SNO(+)
    GROUP BY Y.CO_DVCD, Y.MVEG_YMD, Y.MVEG_SNO
     ) E
WHERE C.HTCY_NO LIKE :ARG_HTCY || '%'
  AND C.HTCY_TPCD LIKE :ARG_TPCD || '%'
  AND E.CO_DVCD = B.CO_DVCD
  AND E.INCU_YMD = B.INCU_YMD
  AND E.INCU_SNO = B.INCU_SNO
  AND B.CO_DVCD = C.CO_DVCD
  AND B.HTEG_UND_YMD = C.HTEG_UND_YMD
  AND B.UND_SNO = C.UND_SNO
  AND C.FARM_RLE_NO = D.FARM_RLE_NO
 

Leave Comments