select ehu_awb.*
  from ehu_awb
 where ehu_awb.cmp = 'BH'
   and (origin_stn = 'BHHKG' or ccn_stn = 'BHHKG' or
       ehu_awb.dest_stn = 'BHHKG')
   and ehu_awb.awb_date <= '20110831'
   and ehu_awb.stn = 'HKG'
ehu_awb这张表有100多个字段,所以数据量很大,不过仅仅查询4000多行,就提示超过100M的缓存了。如何优化,索引也建了,也rebuild了索引。效果还是一样。
光是对EHU_AWB,不加任何条件的全表扫描,仅仅8000多行数据,就需要用30秒左右。我用它导出水晶报表,至少要1 minute以上。无语,相当无语

解决方案 »

  1.   

    建立索引是必须的。  把要查询的字段列出来,不要用*, 用*查询会有一个解析的过程。select ehu_awb.A,ehu_awb.B
           from ehu_awb
    where ehu_awb.cmp = 'BH'     
          and ehu_awb.stn = 'HKG'
          and ehu_awb.awb_date <= '20110831'
          and (origin_stn = 'BHHKG' or ccn_stn = 'BHHKG' or ehu_awb.dest_stn = 'BHHKG')
      

  2.   

    如果有给查询条件列建立索引, 可以用Union来替换Or
    select ehu_awb.A,ehu_awb.B
      from ehu_awb
    where ehu_awb.cmp = 'BH'   
      and ehu_awb.stn = 'HKG'
      and ehu_awb.awb_date <= '20110831'
      and origin_stn = 'BHHKG'
    union
    select ehu_awb.A,ehu_awb.B
      from ehu_awb
    where ehu_awb.cmp = 'BH'   
      and ehu_awb.stn = 'HKG'
      and ehu_awb.awb_date <= '20110831'
      and ccn_stn = 'BHHKG' 
    union
    select ehu_awb.A,ehu_awb.B
      from ehu_awb
    where ehu_awb.cmp = 'BH'   
      and ehu_awb.stn = 'HKG'
      and ehu_awb.awb_date <= '20110831'
      and ehu_awb.dest_stn = 'BHHKG'如果没有给查询条件列建立索引, 就分别以origin_stn = 'BHHKG'  ccn_stn = 'BHHKG'   ehu_awb.dest_stn = 'BHHKG' 来查询, 数据少的放在查询条件左边。
      

  3.   

    有建了一个索引,包含了这四个字段, origin_stn ccn_stn dest_stn awb_date