tcl脚本中使用的oracle查询速度慢

tcl脚本中使用的oracle查询速度慢,oracle,query-performance,Oracle,Query Performance,我编写了这个查询,供orasql和orafetch在tcl脚本中使用。查询被嵌套到一个进程中,该进程的运行次数与给定日期范围需要运行的次数相同(通常每个实例大约运行3次)。带有$YYYYMM的表是由大约1300万行组成的整月表。$advocate变量将提取大约39个不同的帐户ID,这将大大减少返回的行数,但没有claim_status_code='4'(约460000行)那么多。我不知道查询的当前运行时间是什么,因为我不允许它运行超过30分钟。我真的需要这几秒钟,我只是一个新手,知道如何提高速度

我编写了这个查询,供orasql和orafetch在tcl脚本中使用。查询被嵌套到一个进程中,该进程的运行次数与给定日期范围需要运行的次数相同(通常每个实例大约运行3次)。带有$YYYYMM的表是由大约1300万行组成的整月表。$advocate变量将提取大约39个不同的帐户ID,这将大大减少返回的行数,但没有claim_status_code='4'(约460000行)那么多。我不知道查询的当前运行时间是什么,因为我不允许它运行超过30分钟。我真的需要这几秒钟,我只是一个新手,知道如何提高速度。我在优化查询时查阅了oracle文档,并尝试将这些建议纳入到我所写的内容中。任何帮助都将不胜感激

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子句进行筛选。我不知道如何运行解释计划。我在上看到的似乎不起作用。