Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle中SQL查询的调优_Sql_Oracle_Performance - Fatal编程技术网

Oracle中SQL查询的调优

Oracle中SQL查询的调优,sql,oracle,performance,Sql,Oracle,Performance,我非常感谢您在调优下面的SQL查询时提供的帮助。当我取消它时,它持续运行了10分钟 MARC_SEL在52秒内给了我31253张唱片 MVKE_SEL在22秒内给了我431060张唱片 我对它进行了重构以使用with子句,但没有做太多的更改。我还可以合并什么来加快它。请帮忙 WITH ALL_XSAP_MATNR AS (SELECT DISTINCT XSAP.MATNR,XSAP.MTART,XSAP.SOURCE FROM XXX_MAIN.XXX_XSAP XSAP

我非常感谢您在调优下面的SQL查询时提供的帮助。当我取消它时,它持续运行了10分钟

MARC_SEL在52秒内给了我31253张唱片 MVKE_SEL在22秒内给了我431060张唱片

我对它进行了重构以使用with子句,但没有做太多的更改。我还可以合并什么来加快它。请帮忙

    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

首先简化查询,因为您不需要执行多个
DISTINCT
s(这仅在最终输出中是必需的),并且您选择了许多不输出的列。您还将连接一些未从中选择的表,如果这些表有多个匹配行,则可能会生成重复行-使用类似于
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 )

首先简化查询,因为您不需要执行多个
DISTINCT
s(这仅在最终输出中是必需的),并且您选择了许多不输出的列。您还将连接一些未从中选择的表,如果这些表有多个匹配行,则可能会生成重复行-使用类似于
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 )

为子查询添加了提示,并在一分钟内返回

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

为子查询添加了提示,并在一分钟内返回

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

请不要使用
WHERE
语句进行连接,而是使用
LEFT | RIGHT | INNER连接。。。关于
语句。用于加入的
WHERE
语句是遗留语句,不应使用。请编辑您的问题,并包括上述表/视图的
CREATE TABLE
和/或
CREATE VIEW
。包括定义的索引。还包括查询的解释计划的输出。谢谢。请不要使用
WHERE
语句进行连接,而是使用
LEFT | RIGHT | INNER连接。。。关于
语句。用于加入的
WHERE
语句是遗留语句,不应使用。请编辑您的问题,并包括上述表/视图的
CREATE TABLE
和/或
CREATE VIEW
。包括定义的索引。还包括查询的解释计划的输出。谢谢。抱歉@MT0,我确实需要其他表中的值:我在原始问题中编辑了代码,以显示我在输出中需要的所有值。抱歉@MT0,我确实需要其他表中的值:我在原始问题中编辑了代码,以显示我在输出中需要的所有值。