如何优化查看oracle sql
我不擅长sql和oracle,我需要帮助优化此视图以尽快获得结果。目前,运行select子句需要7分钟 这是一种观点:如何优化查看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
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这是添加到问题描述中的解释计划谢谢您的评论我在问题描述中添加了查询执行计划