【发布时间】:2023-04-08 05:49:01
【问题描述】:
请告诉我如何调整此查询以获得更好的性能/执行时间。
PS-它是别人开发的,交给我的。
附加了查询(我知道这是一个巨大的!)--
任何关于如何使用聚合处理连接和子查询的想法都会非常有帮助。
SELECT /*+MONITOR*/ gcibjdnf.danfe,
gcibjdnf.bjd_situacao,
gcibjdnf.obs_rejeicao,
gcibjdnf.bjd_tipo_cobranca,
gcibjdnf.bjd_data_vencto_cbs,
(SELECT SUM(gcinfitens.item_valor_contratar)
FROM gcinfitens
WHERE gcinfitens.danfe = gcibjdnf.danfe) AS nf_vl_contratar,
(SELECT Max(id_contgrupo) FROM gcrcontitens WHERE gcrcontitens.danfe = gcibjdnf.danfe) AS id_contgrupo,
(SELECT MIN(nu_interv)
FROM gcrcondper
WHERE gcrcondper.id_cond = gcccond.id_cond
) AS nu_min_prz,
(SELECT MAX(nu_interv)
FROM gcrcondper
WHERE gcrcondper.id_cond = gcccond.id_cond
) AS nu_max_prz,
priper.vl_taxa AS nu_taxa,
priper.cd_tp_taxa,
priper.cd_indicador,
gcccond.nm_cond,
gcccond.cd_tp_ctr,
priper.sg_mod AS sg_mod_cond,
gcccond.dt_validade,
gcccond.cd_sit AS cd_sit_cond,
gcccond.nu_car_prz,
gcccond.cd_base_carencia,
gcccond.nu_car_desc,
apcconc.cd_loja,
apcconc.cd_concess,
apcconc.cd_conc_mat,
apcconc.nm_conc,
apcconc.nm_apelido,
apcconc.cd_tp_mercado,
dnccontrfundo.dt_emis_ctr
FROM gcibjdnf
LEFT JOIN apcconc ON TO_CHAR(apcconc.cd_sap_dealer) = gcibjdnf.dealer_sap
LEFT JOIN gcccond ON gcccond.id_cond = gcibjdnf.id_cond
LEFT JOIN dnccontrfundo ON dnccontrfundo.danfe = gcibjdnf.danfe
AND dnccontrfundo.cd_sit NOT IN ('CA','RE')
LEFT JOIN gcrcondper priper ON priper.id_cond = gcccond.id_cond
AND priper.sq_per = 1
WHERE (( apcconc.cd_concess = '1586297'
OR apcconc.cd_conc_mat = '1586297') AND gcibjdnf.bjd_situacao = 'I' AND bjd_sit_interna IN ('NO', 'SD'))
ORDER BY apcconc.nm_apelido, danfe
【问题讨论】:
-
你的问题不清楚..你有哪个错误? SQL Developer 中的“错误”%s:无效标识符“。” ???或““GCCCOND.ID_COND”,无效标识符“...第一个与查询中没有的参数有关..第二个是列名...确保您有...无论如何您正在使用聚合没有组的函数,这应该引发另一个错误
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。) PS 你有一个语法错误。阅读语法。尽可能多地表明组成子表达式是可以的。明确说明您的问题是关于 那个错误 并在稍后的新帖子中询问您的总体目标。 PS 显然这里有非最小代码/数据。
-
(以下不是语法问题,而是--)了解 LEFT JOIN ON 返回的内容: INNER JOIN ON rows UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 WHERE 或 INNER JOIN ON 在 OUTER JOIN ON 删除任何由 NULL 扩展的行后,需要右 [sic] 表列不为 NULL,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。
-
请阅读this post on asking Oracle tuning questions。它不仅可以帮助您提出更好的问题,还可以帮助您自己调整查询。
标签: sql oracle performance query-optimization sql-tuning