各位大侠好,我有个sql语句运行时间大约需要1分钟,那位大侠能帮我提高一下效率呢,语句为:
select a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id,min(a.acct_month) min_acct_month,max(a.acct_month) max_acct_month,sum(a.acct_charge)  sum_acct_charge
   from wlmq.lmf_acct_item_20080629@ods a where EXISTS (select b.serv_id from reduser_serv_t b where b.serv_id=a.serv_id)
   group by a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id;表reduser_serv_t和wlmq.lmf_acct_item_20080629@ods在serv_id上都有索引,其中表wlmq.lmf_acct_item_20080629@ods的数据量比较大,约为几百万,表reduser_serv_t的数据只有两三条

解决方案 »

  1.   

    这个试一下:
    select /*+ ordered*/a.acc_nbr,
           a.serv_id,
           a.acct_id,
           a.cust_id,
           a.region_id,
           a.product_offer_id,
           a.product_id,
           min(a.acct_month) min_acct_month,
           max(a.acct_month) max_acct_month,
           sum(a.acct_charge) sum_acct_charge
      from reduser_serv_t b, wlmq.lmf_acct_item_20080629@ods a
     where b.serv_id in(a.serv_id)
     group by a.acc_nbr,
              a.serv_id,
              a.acct_id,
              a.cust_id,
              a.region_id,
              a.product_offer_id,
              a.product_id;如果不好使就把/*+ ordered*/换成/*+ ordered index(a, 索引名)*/再试一下,
    如果还不好使就再改成/*+ ordered use_nl(b, a)*/再试一下。
    如果还不好使我就不知道了。
      

  2.   

    select a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id,min(a.acct_month) min_acct_month,max(a.acct_month) max_acct_month,sum(a.acct_charge)  sum_acct_charge 
      from wlmq.lmf_acct_item_20080629@ods a ,select b.serv_id from reduser_serv_t b where b.serv_id=a.serv_id  group by a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id; 不要试用IN 和 EXITS
      

  3.   

    楼上的,in和exits是可以互换的。
    但是等号和exits不一定可以互换。
    如果有重复的就不可以互换。所以你这样修改不一定可行,如果可以确认b.serv_id与a.serv_id都是唯一的就可以这样。
    不过楼主的问题显然不是出在exits上,可能的问题是没有走索引或者连接顺序不对,或者连接方式不对,
    我把exits改成in是为了方便调整连接顺序。