Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Query Optimization - Fatal编程技术网

如何优化查看oracle sql

如何优化查看oracle sql,sql,oracle,performance,query-optimization,Sql,Oracle,Performance,Query Optimization,我不擅长sql和oracle,我需要帮助优化此视图以尽快获得结果。目前,运行select子句需要7分钟 这是一种观点: CREATE OR REPLACE FORCE VIEW "DMUSEWADM"."SOUS_FAMILLE_WITH_CATALOG_INFO" ("IDSOUSFAMILLE", "LIBELLESOUSFAMILLE", "DATEMODIFSF", "IDFAMILLE", "CHEMIN", "GNP", "TYPEFICHIER", "ESTPLANIFIAB

我不擅长sql和oracle,我需要帮助优化此视图以尽快获得结果。目前,运行select子句需要7分钟

这是一种观点:

CREATE OR REPLACE FORCE VIEW "DMUSEWADM"."SOUS_FAMILLE_WITH_CATALOG_INFO" 

("IDSOUSFAMILLE", "LIBELLESOUSFAMILLE", "DATEMODIFSF", "IDFAMILLE", 
"CHEMIN", "GNP", "TYPEFICHIER", "ESTPLANIFIABLE", "DATEPLANIFIABLE", 
"AUTEURMODIFSF", "NATURESOUSFAMILLE", "LIBELLEMETIERSOUSFAMILLE", 
"CONTACTPRODUCTEUR", "CATALOGVISIBILITY", "PREVISIONALDATE", 
"DATEDERNIERCHARGEMENT", "DATEPROCHAINCHARGEMENT", "LIBELLEFAMILLE") AS 

SELECT SF."IDSOUSFAMILLE",SF."LIBELLESOUSFAMILLE",SF."DATEMODIFSF",SF."IDFAMILLE",SF."CHEMIN",SF."GNP", SF."TYPEFICHIER",SF."ESTPLANIFIABLE",SF."DATEPLANIFIABLE",SF."AUTEURMODIFSF",SF."NATURESOUSFAMILLE",SF."LIBELLEMETIERSOUSFAMILLE",SF."CONTACTPRODUCTEUR",SF."CATALOGVISIBILITY",SF."PREVISIONALDATE", 
( SELECT datefinchrgt from chargement where numchrgt = ( select  max(numchrgt) from CHARGEMENT where nomhbase = ( select nomhbase from hbase where nomes = SF.IDSOUSFAMILLE ) and etatchrgt = 'OK')
) as DATEDERNIERCHARGEMENT, 
( SELECT (
    CASE WHEN DATECHARGEMENT IS NOT NULL THEN
        (
        CASE WHEN DATENSF IS NOT NULL THEN
            GREATEST(DATECHARGEMENT, DATENSF)
        ELSE
            DATECHARGEMENT
        END
        )
    ELSE
        DATENSF
    END
    )
  FROM 
    (
      SELECT 
        subsf.idsousfamille as subid,
        (SELECT max(c.dateauplustot) FROM CHARGEMENT c, HBASE h WHERE c.typechrgt = 'HBASEESDATA' and c.etatchrgt = 'PREVU' and c.nomhbase = h.nomhbase and h.nomes = subsf.idsousfamille) as DATECHARGEMENT,
        (SELECT max(nsf.dateauplustot) FROM NAS_SOUSFAMILLE nsf WHERE nsf.etatchrgt = 'PREVU' AND nsf.sousfamille = subsf.idsousfamille) as DATENSF
      FROM sousfamille subsf
    ) 
 WHERE subid = SF.idsousfamille
) as DATEPROCHAINCHARGEMENT,

( 
  SELECT f.libelleFamille from famille f where sf.idfamille = f.idfamille
) as LIBELLEFAMILLE

FROM SOUSFAMILLE SF;

我如何优化它以减少执行时间

我将感谢任何帮助:)

下面是查询的解释计划


正如其他评论已经提到的,您的第一步是获取查询执行计划,并在那里搜索瓶颈

然而,我立即在这里看到了多个危险信号。这里有一个

您正在为
sousfamille
的每一行运行相关聚合子查询

  SELECT 
    subsf.idsousfamille as subid,
    (SELECT max(c.dateauplustot) FROM CHARGEMENT c, HBASE h WHERE c.typechrgt = 'HBASEESDATA' and c.etatchrgt = 'PREVU' and c.nomhbase = h.nomhbase and h.nomes = subsf.idsousfamille) as DATECHARGEMENT,
    (SELECT max(nsf.dateauplustot) FROM NAS_SOUSFAMILLE nsf WHERE nsf.etatchrgt = 'PREVU' AND nsf.sousfamille = subsf.idsousfamille) as DATENSF
  FROM sousfamille subsf
假设您的
sousfamille
表有1M行,而
NAS\u sousfamille
表有1M行,您将总共读取1G行

你不必这么做

解决此问题的一种方法是将所有相关的
DATECHARGEMENT
DATENSF
值预先聚合一次,然后将结果集加入
sousfamille

SELECT 
    subsf.idsousfamille as subid,
    h.DATECHARGEMENT,
    nsf.DATENSF
  FROM sousfamille subsf
  left join (SELECT h.homes, max(c.dateauplustot) DATECHARGEMENT FROM CHARGEMENT c, HBASE h WHERE c.typechrgt = 'HBASEESDATA' and c.etatchrgt = 'PREVU' and c.nomhbase = h.nomhbase) h 
  on subsf.idsousfamille = h.homes
  left join (SELECT nsf.sousfamille, max(nsf.dateauplustot) DATENSF FROM NAS_SOUSFAMILLE nsf WHERE nsf.etatchrgt = 'PREVU') nsf
  on nsf.sousfamille = subsf.idsousfamille

试试看

你可以试试这个,但这是一个很长的问题,我不知道我是不是犯了什么错误

查询:

SELECT SF."IDSOUSFAMILLE",
       SF."LIBELLESOUSFAMILLE",
       SF."DATEMODIFSF",
       SF."IDFAMILLE",
       SF."CHEMIN",
       SF."GNP",
       SF."TYPEFICHIER",
       SF."ESTPLANIFIABLE",
       SF."DATEPLANIFIABLE",
       SF."AUTEURMODIFSF",
       SF."NATURESOUSFAMILLE",
       SF."LIBELLEMETIERSOUSFAMILLE",
       SF."CONTACTPRODUCTEUR",
       SF."CATALOGVISIBILITY",
       SF."PREVISIONALDATE",

       d.datefinchrgt AS DATEDERNIERCHARGEMENT,

       CASE WHEN DATECHARGEMENT IS NOT NULL THEN (CASE WHEN DATENSF IS NOT NULL THEN GREATEST(DATECHARGEMENT, DATENSF)
                                                   ELSE DATECHARGEMENT END)
            ELSE DATENSF END AS DATEPROCHAINCHARGEMENT,

       f.libelleFamille AS LIBELLEFAMILLE         
FROM SOUSFAMILLE SF
LEFT JOIN famille f
    ON sf.idfamille = f.idfamille
LEFT JOIN sousfamille subsf
    ON subsf.idsousfamille = SF.idsousfamille
      LEFT JOIN (SELECT nsf.sousfamille,
                        max(nsf.dateauplustot) DATECHARGEMENT
                 FROM NAS_SOUSFAMILLE nsf
                 WHERE nsf.etatchrgt = 'PREVU'
                 GROUP BY nsf.sousfamille) nsf
              ON nsf.sousfamille = subsf.idsousfamille
      LEFT JOIN (SELECT h.nomes,
                        max(c.dateauplustot) DATENSF
                 FROM CHARGEMENT c
                 JOIN HBASE h
                   ON c.nomhbase = h.nomhbase
                   AND c.typechrgt = 'HBASEESDATA'
                   AND c.etatchrgt = 'PREVU'
                  GROUP BY  h.nomes) h
               ON h.nomes = subsf.idsousfamille
LEFT JOIN (SELECT c.datefinchrgt,
                  c.nomes
           FROM (SELECT ch.datefinchrgt,
                        hb.nomes,
                        ROW_NUMBER()OVER(PARTITION BY datefinchrgt ORDER BY ch.numchrgt desc) as rn
                 FROM hbase hb
                 JOIN CHARGEMENT ch
                   ON ch.nomhbase = hb.nomhbase
                   AND hb.etatchrgt = 'OK') c
            WHERE c.rn = 1) d
                ON d.nomes = SF.IDSOUSFAMILLE;

您是否执行了解释计划以查看查询访问权限?这是第一件要做并发布的事情。调优Oracle查询不仅仅是看SQL语句和抚摸下巴。我们需要的信息比你目前提供的要多得多。请阅读询问Oracle性能问题的正确方法。@OldProgrammer如何做?@OldProgrammer这是添加到问题描述中的解释计划谢谢您的评论我在问题描述中添加了查询执行计划