쿼리 속도가 넘 느려서요.. 0 1 1,968

by tae [Oracle Tuning] [2011.09.08 10:01:43]



아래 쿼리로 돌리면 현재 1분~1분30초 정도 시간이 걸립니다..ㅠㅜ
데이타 가져오는 rows는 불과 100건 남짓인데도요...

밑에 union 부분의 데이타 가져오는 부분도 시간이 10~20초 소요되는데
한번 보시고 개선사항이 있을 만한 부분 지적해 주시면 도움이 많이 될거 같네요.

감사합니다..


SELECT
          sales.SDDOCO            AS ORDERNO,
          sales.SDDCTO            AS ORDERTY,
          sales.SDLNID            AS LINE_NO,
          sales.SDTRDJ            AS ORDER_DT,
          sales.SDDRQJ            AS REQUEST_DT,
          sales.SDADDJ            AS ACTUAL_SHIP_DT,
          add_bk.ABAN8            AS CUST_CD,
          TRIM(add_bk.ABALPH)     AS CUST_NM,
          SH.ABAN8                AS SHIPTO_CD,
          TRIM(SH.ABALPH)         AS SHIPTO_NM,
          TRIM(addres.ALADD1)     AS ADD1,
          TRIM(addres.ALADD2)     AS ADD2,
          TRIM(addres.ALADD4)     AS ADD4,
          TRIM(addres.ALADDZ)     AS ZIP_CD,
          sales.SDCO              AS COMPANY,
          Trim(sales.SDMCU)       AS PLANT_CD,
          TRIM(F.ABALKY)          AS PLANT_DESC,
          TRIM(itm.IMLITM)        AS ITEM_CD,
          DECODE(SUBSTR(itm.IMDSC1,1,2), '벽산', TRIM(SUBSTR(itm.IMDSC1,3,LENGTH(itm.IMDSC1))), TRIM(itm.IMDSC1))
                          AS ITEM_DESC,
          sales.SDUORG / 100      AS ORDER_QTY,
          sales.SDUOM             AS UNIT,
          sales.SDPQOR / 100      AS PRIMARY_QTY,
          sales.SDUOM1            AS UNIT1,
          sales.SDSQOR / 100      AS SECOND_QTY,
          sales.SDUOM2            AS UNIT2,
          sales.SDITWT / 10000    AS WEIGHT,
          sales.SDUOM4            AS WEIGHT_UNIT,
          sales.SDUPRC / 10000    AS PRICE,
          sales.SDAEXP            AS AMOUNT,
          sales.SDLTTR            AS STATUS1,
          sales.SDNXTR            AS STATUS2,
          DECODE(sales.SDNXTR,'522',DECODE(sales.SDLTTR,'900','오더접수(재고부족)','오더접수'),
          '525',DECODE(sales.SDLTTR,'900','신용체크(재고부족)','신용체크'),
          '527','출하접수','530','배차완료','560','출하완료',
          '580','출하완료','620','출하완료','999','출하완료',' ')
                                  AS STATUS_DESC,
          sales.SDURRF            AS DRIVER_PHONE,
          sales.SDCDCD            AS SHIPMENT_CD,
          sales.SHVR01            AS CUST_PO,
          sales.SDTORG            AS ORDER_TAKER,
          sales.SHHOLD            AS HOLD_CODE,
          TRIM(cust_mst.A5CMC1)   AS SALESREP_CD,
          sales.SDCNID            AS TRUCK_NO,
          TRIM(C.ABALPH)          AS SALESREP_NM,
          TRIM(cust_mst.A5CMC2)   AS TEAM_CD,
          TRIM(D.ABALPH)          AS TEAM_NM,
          TRIM(BTYPE.DRKY)        AS BUILDING_TYPE,
          TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')
                                  AS INSERT_DT,
          ''                      AS trans_ty,
          ''                      AS receiver,
          ''                      AS DUMMY
FROM
       TEST8DTA.F0101@LGKDDB add_bk  -- address book
          INNER JOIN
            (
              SELECT
                    SDDOCO, SDDCTO, SDLNID, SDTRDJ, SDDRQJ, SDADDJ, SDCO, SDMCU, SDUORG, SDUOM, SDPQOR, SDUOM1, SDSQOR,
                    SDUOM2, SDITWT, SDUOM4, SDUPRC, SDAEXP, SDLTTR, SDNXTR, SDURRF, SDCDCD, SHVR01, SDTORG,SHHOLD, SDCNID,
                    SDAN8, SDSHAN, SDLITM
              FROM TEST8DTA.F4211@LGKDDB A, TEST8DTA.F4201@LGKDDB B
              WHERE A.SDDOCO = B.SHDOCO AND A.SDDCTO = B.SHDCTO AND SDTRDJ BETWEEN 111244 AND 111251 AND
                    SDDCTO NOT IN ('SA','SW','SH','ST','S5','SK','CA','CW') AND SDLTTR <> '980'
              UNION ALL
              SELECT
                    SDDOCO, SDDCTO, SDLNID, SDTRDJ, SDDRQJ, SDADDJ, SDCO, SDMCU, SDUORG, SDUOM, SDPQOR, SDUOM1, SDSQOR,
                    SDUOM2, SDITWT, SDUOM4, SDUPRC, SDAEXP, SDLTTR, SDNXTR, SDURRF, SDCDCD, SHVR01, SDTORG, SHHOLD, SDCNID,
                    SDAN8, SDSHAN, SDLITM
              FROM TEST8DTA.F42119@LGKDDB A
                    LEFT OUTER JOIN TEST8DTA.F42019@LGKDDB B ON A.SDDOCO = B.SHDOCO AND A.SDDCTO = B.SHDCTO
              WHERE SDTRDJ BETWEEN 111213 AND 111251 AND
                    SDDCTO NOT IN ('SA','SW','SH','ST','S5','SK','CA','CW') AND SDLTTR <> '980'
            ) sales ON add_bk.ABAN8 = sales.SDAN8
          INNER JOIN TEST8DTA.F0301@LGKDDB cust_mst ON add_bk.ABAN8 = cust_mst.A5AN8 AND LENGTH(add_bk.ABAN8)=4 -- customer master
          LEFT OUTER JOIN TEST8DTA.F0101@LGKDDB C ON cust_mst.A5CMC1 = C.ABAN8 -- emp number
          LEFT OUTER JOIN TEST8DTA.F0101@LGKDDB D ON cust_mst.A5CMC2 = D.ABAN8 -- dept code
          LEFT OUTER JOIN TEST8DTA.F0101@LGKDDB F ON Trim(sales.SDMCU) = F.ABAN8 -- plant code
          LEFT OUTER JOIN TEST8DTA.F0101@LGKDDB sh ON sales.sdshan = sh.ABAN8 AND Length(SH.ABAN8) = 7-- ship to code
          LEFT OUTER JOIN TEST8DTA.F0116@LGKDDB addres ON sh.ABAN8 = addres.ALAN8 -- address
          LEFT OUTER JOIN TEST8DTA.F4006@LGKDDB addres ON sales.sddoco = addres.oadoco AND sales.sddcto = addres.oadcto AND OAANTY = '2'
          INNER JOIN TEST8DTA.F4101@LGKDDB itm ON sales.sdlitm = itm.imlitm  AND IMSTKT <> 'O'         -- item master
                                                              AND IMGLPT IN ('LK20','LK21','LK22','LK10','LK11','LK12')
                                                              AND IMSRP1 IN ('A','B','D','F','MP')
          LEFT OUTER JOIN TEST8CTL.F0005@LGKDDB btype ON Trim(add_bk.ABAC06) = Trim(btype.DRKY) AND btype.DRSY='01' and btype.DRRT='06' -- bILDING TYPE
by 마농 [2011.09.08 10:30:26]
1. 모든 테이블이 DB링크 테이블이네요.
- 직접 붙어 작업하면 빠를듯.
2. Union 쿼리의 SDTRDJ BETWEEN 조건으로 인덱스를 타야 할듯합니다.
- 해당 항목에 인덱스가 있는지? 인덱스를 타는지?
- 혹시 해당항목이 문자타입이라면 조건도 문자로 주셔야 인덱스 탑니다.
3. Not In 조건을 다른 조건으로 대체할 수 없는지? 검토해 보세요.
4. 공통코드 테이블과의 조인이 이상합니다.
- 보통 공통코드 테이블과 조인할때 조건이 (분류코드 + 코드)으로 주어지는데
- 분류코드 조건이 없이 막바로 코드만 조인하네요. 인덱스를 탈지 의문입니다.
- 조인조건에 Trim 이 꼭 필요한것인지도 검토해 보세요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입