日期:2014-05-17  浏览次数:21093 次

请教sql优化
这句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

------解决方案--------------------
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')

------解决方案--------------------
把trunc去掉,没必要,因为后面只到天
------解决方案--------------------
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)
  selec