Oracle
 sql >> Database >  >> RDS >> Oracle

Ottimizzazione della query SQL in Oracle

Inizia semplificando la tua query poiché non è necessario eseguire più DISTINCT s (è necessario solo nell'output finale) e stai selezionando molte colonne che non stai emettendo. Stai anche unendo alcune tabelle da cui non stai selezionando e se ci sono più righe corrispondenti per queste, potrebbe generare righe duplicate, usando qualcosa come EXISTS può eliminare questi join.

In questo modo:

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 )