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

Tuning af SQL-forespørgsel i Oracle

Start med at forenkle din forespørgsel, da du ikke behøver at gøre flere DISTINCT s (det er kun nødvendigt i det endelige output), og du vælger mange kolonner, som du ikke udskriver. Du tilslutter dig også nogle tabeller, som du ikke vælger fra, og hvis der er flere matchende rækker for disse, kan det generere duplikerede rækker - ved at bruge noget som EXISTS kan fjerne disse joinforbindelser.

Sådan:

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 )


  1. Få resultater, der falder inden for markørradius fra databasen

  2. konverter række til kolonner i oracle10g

  3. Hvordan opdaterer man flere tabeller med en enkelt mysql-forespørgsel?

  4. Dynamisk tabelnavn i postgreSQL 9.3