次のようなカウント、平均、およびカンマ区切りのリストでいっぱいの1行のテーブルを生成する関数の一部として実行されるクエリがあります。
select
(select
count(*)
from vw_disp_details
where round = 2013
and rating = 1) applicants,
(select
count(*)
from vw_disp_details
where round = 2013
and rating = 1
and applied != 'yes') s_applicants,
(select
LISTAGG(discipline, ',')
WITHIN GROUP (ORDER BY discipline)
from (select discipline,
count(*) discipline_number
from vw_disp_details
where round = 2013
and rating = 1
group by discipline)) disciplines,
(select
LISTAGG(discipline_count, ',')
WITHIN GROUP (ORDER BY discipline)
from (select discipline,
count(*) discipline_count
from vw_disp_details
where round = 2013
and rating = 1
group by discipline)) disciplines_count,
(select
round(avg(util.getawardstocols(application_id,'1','AWARD_NAME')), 2)
from vw_disp_details
where round = 2013
and rating = 1) average_award_score,
(select
round(avg(age))
from vw_disp_details
where round = 2013
and rating = 1) average_age
from dual;
ただし、メインのサブクエリは 6 つではなく、23 あります。
これは次のようなものを返します (CSV の場合):
applicants | s_applicants | disciplines | disciplines_count | average_award_score | average_age
107 | 67 | "speed,accuracy,strength" | 3 | 97 | 23
ここで、where 句の "rating = 1" の部分をプログラムで他の式に置き換えています。vw_disp_details ビューの rating 列自体がサブクエリによってコンパイルされるため、実行に約 90 秒かかる「rating = 1」を除いて、それらはすべてかなり迅速に機能します。
(SELECT score
FROM read r,
eval_criteria_lookup ecl
WHERE r.criteria_id = ecl.criteria_id
AND r.application_id = a.lgo_application_id
AND criteria_description = 'Overall Score'
AND type = 'ABC'
) reader_rank
そのため、関数が実行されると、この余分なクエリによってすべてが劇的に遅くなるようです。
私の質問は、基本的に一連のカウントと平均であるこのようなクエリを実行するためのより良い (より効率的な) 方法はありますか?走るのに90秒。