select c.tskillgrp_code, nvl(sum(case when b.composite_timeout='0' and b.handle_timeout = '0' and b.reply_timeout = '0' and b.archive_timeout = '0' then 1 end),0) notTimeoutCount,nvl(sum(case when b.composite_timeout = '1' then 1 else 0 end),0) compositeCount,nvl(sum(case when b.handle_timeout = '1' then 1 else 0 end),0) handleCount,nvl(sum(case when b.sreply_timeout = '1' then 1 else 0 end),0) replyCount,nvl(sum(case when b.archive_timeout = '1' then 1 else 0 end),0) archiveCount,nvl(count(t.case_no),0) allCount from table_one t,table_two b,table_three c where t.case_no = b.case_no and t.case_no = c.case_no and c.deal_flag = '3' group by c.tskillgrp_code每个表中都有三百万以上的数据,所以关联查询起来相当慢,所以请帮忙优化一下,谢谢!

解决方案 »

  1.   

    单就sql语句本身  感觉木的优化
      

  2.   


    select c.tskillgrp_code,
           nvl(sum(case
                     when b.composite_timeout = '0' and b.handle_timeout = '0' and
                          b.reply_timeout = '0' and b.archive_timeout = '0' then
                      1
                   end),
               0) notTimeoutCount,
           nvl(sum(case
                     when b.composite_timeout = '1' then
                      1
                     else
                      0
                   end),
               0) compositeCount,
           nvl(sum(case
                     when b.handle_timeout = '1' then
                      1
                     else
                      0
                   end),
               0) handleCount,
           nvl(sum(case
                     when b.sreply_timeout = '1' then
                      1
                     else
                      0
                   end),
               0) replyCount,
           nvl(sum(case
                     when b.archive_timeout = '1' then
                      1
                     else
                      0
                   end),
               0) archiveCount,
           nvl(count(t.case_no), 0) allCount
      from table_one t, table_two b, table_three c
     where t.case_no = b.case_no
       and t.case_no = c.case_no
       and c.deal_flag = '3'
     group by c.tskillgrp_code能精简的精简,该建索引的建索引
      

  3.   

    额,表的索引页不经建太多,建多了也影响查询速度的。
    select d.tskillgrp_code,
           sum(notTimeout) notTimeoutCount,
           sum(composite) compositeCount,
           sum(handleCount) handleCount,
           sum(reply) replyCount,
           sum(archive) archiveCount,
           count(t.case_no) allCount
      from (select c.tskillgrp_code,
                   case
                     when b.composite_timeout = '0' and b.handle_timeout = '0' and
                          b.reply_timeout = '' 0
                      '' and b.archive_timeout = '' 0 '' then
                      1
                   end notTimeout,
                   case
                     when b.composite_timeout = '1' then
                      1
                     else
                      0
                   end composite,
                   case
                     when b.handle_timeout = '' 1 '' then
                      1
                     else
                      0
                   end handle,
                   case
                     when b.sreply_timeout = '' 1 '' then
                      1
                     else
                      0
                   end reply,
                   case
                     when b.archive_timeout = '1' then
                      1
                     else
                      0
                   end archive,
                   t.case_no
              from table_one t, table_two b, table_three c
             where t.case_no = b.case_no
               and t.case_no = c.case_no
               and c.deal_flag = '3') d
     group by d.tskillgrp_code这个你试试不过效果也不一定明显你也可以从sga,pga方向看看内存上的问题
      

  4.   

    你的group by估计消耗不少..........不分组看看?
      

  5.   

    看下 ='3' 以及类似列的数据类型,一定要匹配上
    case_no上建立索引是肯定的了
    其他第一感觉不需要
    还是慢的话,拉执行计划及awr报告出来
      

  6.   

    你的group by估计消耗不少..........不分组看看?
      

  7.   

    应该不是group by的问题,因为单纯的一个select  nvl(sum(case when b.composite_timeout = '1' then 1 else 0 end) from table_two都需要30秒左右
      

  8.   

    感觉一个select这样都需要30s是不是有些过了?而且case when b.composite_timeout = '1' then 1 else 0 end这种应该建立位图索引
      

  9.   

    LZ 你可以把case when then 修改成 decode 试一试,感觉decode的效率应该比case when要高一些
      

  10.   


    换成decode效果也不太明显,主要的原因是表内的数据量太大了!谢谢