这句sql该怎么优化,数据量大的时候要执行一个多小时,慢死了
insert into swg_log_coll
  (bank_no,
   dep_name,
   user_name,
   full_name,
   domain,
   category,
   gen_date,
   log_state,
   protocol,
   hits,
   addup_time,
   record_cnt)
  select bank_no,
         nvl(dep_name, '--'),
         nvl(user_name, '--'),
         nvl(full_name, '--'),
         nvl(domain, '--'),
         nvl(category, '--'),
         gen_date,
         log_state,
         nvl(protocol, '--'),
         sum(hits),
         sum(addup_time),
         count(1)
    from sr_swg_log_temp s)
   where trunc(s.gen_date) >= to_date('"+earlietDate+"', 'yyyy-mm-dd')
     and trunc(s.gen_date) <= to_date('"+madate+"', 'yyyy-mm-dd')
     and log_state = '01'
   group by bank_no,
            dep_name,
            user_name,
            full_name,
            domain,
            gen_date,
            category,
            log_state,
            protocol;sql 优化 sql

解决方案 »

  1.   

    where trunc(s.gen_date) >= to_date('"+earlietDate+"', 'yyyy-mm-dd')      and trunc(s.gen_date) <= to_date('"+madate+"', 'yyyy-mm-dd')      and log_state = '01'这三个字段加上索引了吗, 另外 如果有索引的话 最好别用trunc,会停用索引的。  如果你加这个函数是为了去掉时分秒的话可以改成 where s.gen_date >=to_date('2013-01-30 00:00:01', 'yyyy-mm-dd hh24:mi:ss')
    and s.gen_date <=to_date('2013-01-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
      

  2.   

    gen_date 和 bank_no 这两个字段有一个索引。按你说的该了 稍微好些但是还是挺慢的,有什么好的优化参考资料推荐推荐
      

  3.   

    把trunc去掉,没必要,因为后面只到天
      

  4.   

    insert into swg_log_coll
      (bank_no,
       dep_name,
       user_name,
       full_name,
       domain,
       category,
       gen_date,
       log_state,
       protocol,
       hits,
       addup_time,
       record_cnt)
      select bank_no,
             nvl(dep_name, '--'),
             nvl(user_name, '--'),
             nvl(full_name, '--'),
             nvl(domain, '--'),
             nvl(category, '--'),
             gen_date,
             log_state,
             nvl(protocol, '--'),
             sum(hits),
             sum(addup_time),
             count(1)
        from sr_swg_log_temp s
       where s.gen_date >= to_date('"+earlietDate+"', 'yyyy-mm-dd')
         and s.gen_date <= to_date('"+madate+"', 'yyyy-mm-dd')
         and log_state = '01'
       group by bank_no,
                dep_name,
                user_name,
                full_name,
                domain,
                gen_date,
                category,
                log_state,
                protocol;
      

  5.   

    insert into swg_log_coll
      (bank_no,
       dep_name,
       user_name,
       full_name,
       domain,
       category,
       gen_date,
       log_state,
       protocol,
       hits,
       addup_time,
       record_cnt)
      select bank_no,
             nvl(dep_name, '--'),
             nvl(user_name, '--'),
             nvl(full_name, '--'),
             nvl(domain, '--'),
             nvl(category, '--'),
             gen_date,
             log_state,
             nvl(protocol, '--'),
             sum(hits),
             sum(addup_time),
             count(1)
        from sr_swg_log_temp s
       where log_state = '01'
         and s.gen_date >= to_date('"+earlietDate+"', 'yyyy-mm-dd')
         and s.gen_date <= to_date('"+madate+"', 'yyyy-mm-dd') 
       group by bank_no,
                dep_name,
                user_name,
                full_name,
                domain,
                gen_date,
                category,
                log_state,
                protocol;