2016-05-23 22 views
0

以下のSQLクエリのチューニングについて、本当に感謝しています。私はそれをキャンセルして10分間走り続けた。OracleでのSQLクエリのチューニング

MARC_SELは52秒で私に を31253件のレコードを与え、MVKE_SELは22秒でくれ

を431060件のレコードを与えた私はelse節が、はるかに何changed.Whatで使用することをリファクタリング私はそれを高速化するために組み込むことができます。助けてください。

WITH ALL_XSAP_MATNR 
    AS (SELECT DISTINCT XSAP.MATNR,XSAP.MTART,XSAP.SOURCE FROM XXX_MAIN.XXX_XSAP XSAP 
     WHERE SOURCE = 'SP') 
    , MARC_SEL AS 
    (SELECT DISTINCT A.SOURCE 
        ,MARA.MATNR 
        ,MARA.MTART  
        ,MARA.MBRSH 
        ,MARC.WERKS  
        ,NVL(PX.WERKS,'/') DWERK 
        ,NVL(MBEW.HKMAT,'/') HKMAT 
        ,NVL(MBEW.EKALR,'/') EKALR 
        ,NVL(MARC.STAWN,'/')  STAWN 
    FROM ALL_XSAP_MATNR A 
      , XXX_MAIN.XXX_SAP_MARA MARA 
      , XXX_MAIN.XXX_SAP_MARC MARC 
      , XXX_MAIN.XXX_MP_WERKS_PLANT_XREF PX 
      , XXX_MAIN.XXX_SAP_MBEW MBEW 
    WHERE A.MATNR = MARA.MATNR 
     AND A.MTART = MARA.MTART 
     AND MARA.MATNR = MARC.MATNR 
     AND MARC.MATNR = MBEW.MATNR 
     AND MARC.WERKS = MBEW.BWKEY 
     AND PX.LEGACY_PLANT = MARC.WERKS 
     AND PX.SOURCE = 'SP'         
    ) 
    , MVKE_SEL AS 
    ( SELECT DISTINCT 
        MVKE.MATNR 
        ,'/' LEGACY_ORG  
        ,'/' LEGACY_MATNR  
        ,NVL(MX_VKORG.SAP_DE_VAL,'/') VKORG   
        ,NVL(SUBSTR(MX_VKORG.SAP_DE,6,2),'/') VTWEG 
      --  ,NVL(TVRKME.MSEH3,'/') VRKME   
        ,NVL(MVKE.KONDM,'/') KONDM   
       ,NVL(MVKE.VERSG,'/') VERSG 
        ,'/' IPRKZ   
        ,'/' MHDRZ,NVL(MVKE.VMSTA,'/')  VMSTA 
        ,NVL(TO_CHAR(MVKE.VMSTD ,'YYYYMMDD'),'/') VMSTD  
        ,NVL(MVKE.PMATN,'/') PMATN   
        ,NVL(MVKE.MVGR2,'/')  MVGR2  
        ,NVL(MVKE.MVGR3,'/')  MVGR3   
        ,NVL(MVKE.VAVME,'/')  VAVME   
        ,'/' MVGR4   
        ,'/' MVGR5   
        ,NVL(MVKE.MTPOS,'/') MTPOS   
        ,NVL(MVKE.PRAT1,'/') PRAT1   
        ,NVL(MVKE.SKTOF,'/') SKTOF   
        ,'/' AUMNG   
        ,NVL(MVKE.PRODH,'/') PRODH  
        ,'/' MVGR1    
        ,NVL(MVKE.KTGRM,'/') KTGRM 
        ,MX_VKORG.DESC4 
    FROM  XXX_MAIN.XXX_SAP_MVKE MVKE 
      , XXX_MAIN.XXX_MP_VKVT_XREF MX_VKORG  
    WHERE MX_VKORG.SOURCE_DE_VAL = MVKE.VKORG 
     AND SUBSTR(MX_VKORG.SAP_DE,6,2) = MVKE.VTWEG 
     AND MX_VKORG.SOURCE_TBL = 'SP' 
     AND MX_VKORG.SOURCE_DE = 'MVKE' 
     AND SUBSTR(MX_VKORG.SAP_DE,1,5)= 'VKORG' 
     AND MX_VKORG.DESC2 IS NULL ) 
    SELECT DISTINCT 
         MARC.SOURCE 
         ,MARC.MATNR 
         ,MARC.MTART  
         ,MARC.MBRSH 
         ,MARC.WERKS  
         ,MARC.DWERK 
         ,MARC.HKMAT 
         ,MARC.EKALR 
         ,MARC.STAWN 
         ,MVKE.LEGACY_ORG 
         ,MVKE.LEGACY_MATNR 
         ,MVKE.VKORG 
         ,MVKE.VTWEG 
         ,MVKE.KONDM 
         ,MVKE.VERSG 
         ,MVKE.VMSTA 
         ,MVKE.VMSTD 
         ,MVKE.PMATN 
         ,MVKE.MVGR2 
         ,MVKE.MVGR3 
         ,MVKE.VAVME 
         ,MVKE.MTPOS 
         ,MVKE.PRAT1 
         ,MVKE.SKTOF 
         ,MVKE.PRODH 
         ,MVKE.KTGRM 
    FROM MARC_SEL MARC 
      , MVKE_SEL MVKE 
     WHERE MARC.MATNR = MVKE.MATNR 
     AND MARC.WERKS = MVKE.DESC4 
+2

参加するための 'WHERE'ステートメントを使用しますが、' LEFTを使用しないでください| RIGHT | INNER JOINは... on'の文を。結合のための 'WHERE'ステートメントは遺産であり、使用すべきではありません。 – Munir

+1

あなたの質問を編集し、上記のテーブル/ビューの 'CREATE TABLE'および/または' CREATE VIEW'を含めてください。定義されているインデックスを含めます。また、照会にEXPLAIN PLANからの出力も含めてください。ありがとう。 –

答えて

0

追加されましたサブクエリにヒント、それが戻っ分で来ました。

WITH ALL_XSAP_MATNR 
AS (SELECT /*+ materialize */ DISTINCT XSAP.MATNR,XSAP.MTART,XSAP.SOURCE FROM XXX_MAIN.XXX_XSAP XSAP 
    WHERE SOURCE = 'SP') 
, MARC_SEL AS 
(SELECT /*+ materialize */ DISTINCT A.SOURCE 
       ,MARA.MATNR 
       ,MARA.MTART  
       ,MARA.MBRSH 
       ,MARC.WERKS  
       ,NVL(PX.WERKS,'/') DWERK 
       ,NVL(MBEW.HKMAT,'/') HKMAT 
       ,NVL(MBEW.EKALR,'/') EKALR 
       ,NVL(MARC.STAWN,'/')  STAWN 
FROM ALL_XSAP_MATNR A 
     , XXX_MAIN.XXX_SAP_MARA MARA 
     , XXX_MAIN.XXX_SAP_MARC MARC 
     , XXX_MAIN.XXX_MP_WERKS_PLANT_XREF PX 
     , XXX_MAIN.XXX_SAP_MBEW MBEW 
WHERE A.MATNR = MARA.MATNR 
    AND A.MTART = MARA.MTART 
    AND MARA.MATNR = MARC.MATNR 
    AND MARC.MATNR = MBEW.MATNR 
    AND MARC.WERKS = MBEW.BWKEY 
    AND PX.LEGACY_PLANT = MARC.WERKS 
    AND PX.SOURCE = 'SP'         
) 
, MVKE_SEL AS 
( SELECT /*+ materialize */ DISTINCT 
       MVKE.MATNR 
       ,'/' LEGACY_ORG  
       ,'/' LEGACY_MATNR  
       ,NVL(MX_VKORG.SAP_DE_VAL,'/') VKORG   
       ,NVL(SUBSTR(MX_VKORG.SAP_DE,6,2),'/') VTWEG 
     --  ,NVL(TVRKME.MSEH3,'/') VRKME   
       ,NVL(MVKE.KONDM,'/') KONDM   
      ,NVL(MVKE.VERSG,'/') VERSG 
       ,'/' IPRKZ   
       ,'/' MHDRZ,NVL(MVKE.VMSTA,'/')  VMSTA 
       ,NVL(TO_CHAR(MVKE.VMSTD ,'YYYYMMDD'),'/') VMSTD  
       ,NVL(MVKE.PMATN,'/') PMATN   
       ,NVL(MVKE.MVGR2,'/')  MVGR2  
       ,NVL(MVKE.MVGR3,'/')  MVGR3   
       ,NVL(MVKE.VAVME,'/')  VAVME   
       ,'/' MVGR4   
       ,'/' MVGR5   
       ,NVL(MVKE.MTPOS,'/') MTPOS   
       ,NVL(MVKE.PRAT1,'/') PRAT1   
       ,NVL(MVKE.SKTOF,'/') SKTOF   
       ,'/' AUMNG   
       ,NVL(MVKE.PRODH,'/') PRODH  
       ,'/' MVGR1    
       ,NVL(MVKE.KTGRM,'/') KTGRM 
       ,MX_VKORG.DESC4 
FROM  XXX_MAIN.XXX_SAP_MVKE MVKE 
     , XXX_MAIN.XXX_MP_VKVT_XREF MX_VKORG  
WHERE MX_VKORG.SOURCE_DE_VAL = MVKE.VKORG 
    AND SUBSTR(MX_VKORG.SAP_DE,6,2) = MVKE.VTWEG 
    AND MX_VKORG.SOURCE_TBL = 'SP' 
    AND MX_VKORG.SOURCE_DE = 'MVKE' 
    AND SUBSTR(MX_VKORG.SAP_DE,1,5)= 'VKORG' 
    AND MX_VKORG.DESC2 IS NULL ) 
SELECT DISTINCT /*+ use_hash(MARC,MVKE) */ 
        MARC.SOURCE 
        ,MARC.MATNR 
        ,MARC.MTART  
        ,MARC.MBRSH 
        ,MARC.WERKS  
        ,MARC.DWERK 
        ,MARC.HKMAT 
        ,MARC.EKALR 
        ,MARC.STAWN 
        ,MVKE.LEGACY_ORG 
        ,MVKE.LEGACY_MATNR 
        ,MVKE.VKORG 
        ,MVKE.VTWEG 
        ,MVKE.KONDM 
        ,MVKE.VERSG 
        ,MVKE.VMSTA 
        ,MVKE.VMSTD 
        ,MVKE.PMATN 
        ,MVKE.MVGR2 
        ,MVKE.MVGR3 
        ,MVKE.VAVME 
        ,MVKE.MTPOS 
        ,MVKE.PRAT1 
        ,MVKE.SKTOF 
        ,MVKE.PRODH 
        ,MVKE.KTGRM 
FROM MARC_SEL MARC 
     , MVKE_SEL MVKE 
    WHERE MARC.MATNR = MVKE.MATNR 
    AND MARC.WERKS = MVKE.DESC4 
2

複数DISTINCTのことをする必要はありません(それが最終的な出力にのみ必要です)、あなたが出力されていない多くの列を選択しているとして、あなたのクエリを簡素化することから始めます。また、選択していないテーブルにも参加しています。一致する行が複数ある場合は、重複行が生成される可能性があります。EXISTSなどを使用するとこれらの結合を排除できます。

このように:

WITH MARC_SEL AS (
    SELECT A.SOURCE, 
     MARA.MATNR, 
     MARC.WERKS 
    FROM XXX_MAIN.XXX_XSAP A 
     INNER JOIN XXX_MAIN.XXX_SAP_MARA MARA 
     ON ( A.MATNR = MARA.MATNR 
      AND A.MTART = MARA.MTART) 
     INNER JOIN XXX_MAIN.XXX_SAP_MARC MARC 
     ON ( MARA.MATNR = MARC.MATNR) 
    WHERE EXISTS(SELECT 'X' 
       FROM XXX_MAIN.XXX_MP_WERKS_PLANT_XREF PX 
       WHERE PX.LEGACY_PLANT = MARC.WERKS 
       AND PX.SOURCE = 'SP') 
    AND EXISTS(SELECT 'X' 
       FROM XXX_MAIN.XXX_SAP_MBEW MBEW 
       WHERE MARC.MATNR = MBEW.MATNR 
       AND MARC.WERKS = MBEW.BWKEY) 
    AND A.SOURCE = 'SP' 
) 
, MVKE_SEL AS (
    SELECT NVL(MX_VKORG.SAP_DE_VAL,'/') VKORG, 
      NVL(SUBSTR(MX_VKORG.SAP_DE,6,2),'/') VTWEG, 
      MX_VKORG.DESC4 
    FROM XXX_MAIN.XXX_MP_VKVT_XREF MX_VKORG 
    WHERE EXISTS (SELECT 'X' 
        FROM XXX_MAIN.XXX_SAP_MVKE MVKE 
        WHERE MX_VKORG.SOURCE_DE_VAL = MVKE.VKORG 
        AND SUBSTR(MX_VKORG.SAP_DE,6,2) = MVKE.VTWEG) 
    AND  MX_VKORG.SOURCE_TBL = 'SP' 
    AND  MX_VKORG.SOURCE_DE = 'MVKE' 
    AND  SUBSTR(MX_VKORG.SAP_DE,1,5)= 'VKORG' 
    AND  MX_VKORG.DESC2 IS NULL 
) 
SELECT DISTINCT 
     MARC.SOURCE, 
     MARC.MATNR, 
     MVKE.VKORG, 
     MARC.WERKS, 
     MVKE.VTWEG 
FROM MARC_SEL MARC 
     INNER JOIN MVKE_SEL MVKE 
     ON ( MARC.MATNR = MVKE.MATNR 
      AND MARC.WERKS = MVKE.DESC4) 
+0

私は自分の出力に必要なすべての値を表示するために、元の質問のコードを編集しました。 – Tina

関連する問題