简体   繁体   中英

how can i optimize view oracle sql

i am not strong in sql and oracle and i need help to optimize this view in order to get the result as quickly as possible. Currently, it takes 7 mins when i run its select clause.

this is the view:

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;

How can i optimise it please in order to reduse the execution time?

i would appreciate any help:)

here is the explain plan of the query

在此处输入图像描述

As it has been already mentioned by other comments, your first step is to get the query execution plan, and search for bottlenecks there.

However, I see multiple red flags here immediately. Here's one of them.

You are running correlated aggregating subqueries for every single row of 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

Assuming your sousfamille table has 1M rows, and NAS_SOUSFAMILLE has 1M rows, you will read a total of 1G rows.

You don't have to do this.

One way to address this would be to preaggregate all relevant DATECHARGEMENT and DATENSF values ONCE, and then join the result set to the 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

Try it.

You can try this, but it's long query I don't know if I didn't make somewhere mistake

Query:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM