2017-04-11 3 views
0

J'essaie d'améliorer la vitesse de la requête ci-dessous, mais le champ requis ne peut pas être modifié. Alors je suis resté coincé ici. S'il te plaît, aide-moi à sortir de ce piège. Un petit conseil ou inspiration est également utile !!Essayez d'optimiser une requête PL/SQL

select cg.province_id, 
    (select count(distinct(c.guidance_user_id)) 
     from case_guidance c 
    where c.guidance_status = '2' 
     and c.province_id = cg.province_id) as guidance_cnt, 
    (select count(distinct(c.guidance_user_id)) 
     from case_guidance c 
    where c.guidance_status = '2' 
     and c.guidance_user_type = 'role.type.teacher' 
     and c.province_id = cg.province_id) as guidance_teacher_cnt, 
    (select count(distinct(c.guidance_user_id)) 
     from case_guidance c 
    where c.guidance_status = '2' 
     and c.guidance_user_type = 'role.type.jyy' 
     and c.province_id = cg.province_id) as guidance_jyy_cnt, 
    (select count(distinct(c.guidance_user_id)) 
     from case_guidance c 
    where c.guidance_status = '2' 
     and c.guidance_user_type = 'role.type.expert' 
     and c.province_id = cg.province_id) as guidance_expert_cnt, 
    (select count(distinct(c.case_id)) 
     from case_guidance c 
    where c.guidance_status = '2' 
     and c.province_id = cg.province_id) as guidance_case_cnt 
from case_guidance cg 
where cg.province_id is not null 
group by cg.province_id 
order by guidance_cnt desc 

Répondre

0

Remplacer les sous-requêtes corrélées avec CASE pour éliminer toutes les jointures.

select 
    province_id, 
    count(distinct(case when guidance_status = '2'            then guidance_user_id else null end)) guidance_cnt, 
    count(distinct(case when guidance_status = '2' and guidance_user_type = 'role.type.teacher' then guidance_user_id else null end)) guidance_teacher_cnt, 
    count(distinct(case when guidance_status = '2' and guidance_user_type = 'role.type.jyy'  then guidance_user_id else null end)) guidance_jyy_cnt, 
    count(distinct(case when guidance_status = '2' and guidance_user_type = 'role.type.expert' then guidance_user_id else null end)) guidance_expert_cnt, 
    count(distinct(case when guidance_status = '2'            then case_id   else null end)) guidance_case_cnt 
from case_guidance 
group by province_id; 
order by guidance_cnt desc 

(je volontairement quitté les lignes de code très long pour que les conditions seront alignées Cela contribue à rendre clairement ce que le différence entre les colonnes sont, et qu'ils font presque exactement la même chose.)

+0

Merci, Jon. Il améliore beaucoup la performance et l'alignement des conditions aide vraiment. Tu sauves ma journée. – Simon