tcl脚本中使用的oracle查询速度慢
我编写了这个查询,供orasql和orafetch在tcl脚本中使用。查询被嵌套到一个进程中,该进程的运行次数与给定日期范围需要运行的次数相同(通常每个实例大约运行3次)。带有$YYYYMM的表是由大约1300万行组成的整月表。$advocate变量将提取大约39个不同的帐户ID,这将大大减少返回的行数,但没有claim_status_code='4'(约460000行)那么多。我不知道查询的当前运行时间是什么,因为我不允许它运行超过30分钟。我真的需要这几秒钟,我只是一个新手,知道如何提高速度。我在优化查询时查阅了oracle文档,并尝试将这些建议纳入到我所写的内容中。任何帮助都将不胜感激tcl脚本中使用的oracle查询速度慢,oracle,query-performance,Oracle,Query Performance,我编写了这个查询,供orasql和orafetch在tcl脚本中使用。查询被嵌套到一个进程中,该进程的运行次数与给定日期范围需要运行的次数相同(通常每个实例大约运行3次)。带有$YYYYMM的表是由大约1300万行组成的整月表。$advocate变量将提取大约39个不同的帐户ID,这将大大减少返回的行数,但没有claim_status_code='4'(约460000行)那么多。我不知道查询的当前运行时间是什么,因为我不允许它运行超过30分钟。我真的需要这几秒钟,我只是一个新手,知道如何提高速度
select
case
when clg_payor_id
is null
then payor_id1
else clg_payor_id
end
, count(unique era_id||invoice) count
from marge.e835_clp_$YYYYMM@e835v2
where claim_status_code='4' and payor_id1!='client'
group by case when clg_payor_id is null then payor_id1 else clg_payor_id end, era_id
having era_id
in (
select era_id
from marge.e835_checks_$YYYYMM@e835v2
where input_date between '$date1' and '$date2'
group by account_id, era_id
having account_id
in (
select ea.account_id
from cowboy.enrolled_submitters es
, cowboy.enrolled_accounts ea
where ea.submitter_id=es.submitter_id
and es.advocate='$advocate'
)
)
order by count desc
更新:根据建议,我已经将era_id从HAVING子句中移到WHERE中。当我运行这个查询时,它返回了很多不需要的结果,因为所有的帐户id都存在,但我不知道为什么。但查询确实运行了,只花了约9秒。好多了
select
case
when clg_payor_id
is null
then payor_id1
else clg_payor_id
end
, account_id, count(unique era_id||invoice) count
from marge.e835_clp_$YYYYMM@e835v2
where claim_status_code='4'
and payor_id1!='client'
and era_id
in (
select era_id
from marge.e835_checks_$YYYYMM@e835v2
where input_date between '$date1' and '$date2'
group by account_id
, era_id
having account_id
in (
select ea.account_id
from cowboy.enrolled_submitters es
, cowboy.enrolled_accounts ea
where ea.submitter_id=es.submitter_id
and es.advocate='$advocate'
)
)
group by case when clg_payor_id is null then payor_id1 else clg_payor_id end, account_id
order by count desc
什么是查询计划?看起来您正在通过数据库链接引用本地表以及其他数据库中的表,是吗?我对它的理解还不够透彻,无法列出查询计划。但是,是的,我相信你是正确的。为什么要在
having
子句中引用非聚合列?请尝试将纪元id放入(…
在您的WHERE
子句中设置条件,并在此处发布解释计划。@Rachcha我试图按照我阅读的oracle文档的建议使用having子句进行筛选。我不知道如何运行解释计划。我在上看到的似乎不起作用。