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.