select * from orders o, pats_in_hospital h ,drug_dispens_property p 
WHERE h.patient_id = o.patient_id  and p.dispensary='7070' and p.drug_code=o.order_code 
and (p.dispensing_property='注射类医嘱'  or p.dispensing_property='输液类医嘱')and o.order_class='A' and o.order_status in (2,3) and h.ward_code = '4232'and o.start_date_time >= to_date('2012-05-01 16:00:00','yyyy-mm-dd hh24:mi:ss')
and o.start_date_time <= to_date('2012-05-03 16:00:00','yyyy-mm-dd hh24:mi:ss') --sysdate 5.2 10:00
and (((o.stop_date_time is null or o.stop_date_time > to_date('2012-05-03 10:00:00','yyyy-mm-dd hh24:mi:ss'))
     and o.repeat_indicator=1 and o.last_perform_date_time<=to_date('2012-05-03 16:00:00','yyyy-mm-dd hh24:mi:ss') )
or (o.last_perform_date_time is null and o.repeat_indicator=0) )
语句如上。orders表的确数据很多 ,大概有不到1000w条数据 。木有索引。但是我个人感觉还是不应该这么慢。请各位帮我看看有没有可以优化的地方 。谢谢Oracle性能优化

解决方案 »

  1.   

    不要把优化工作局限于“SQL”!
      

  2.   

    非要说SQL的话,建议把所有 表A.X=表B.X语句放在最内,表A.Y='yy'放在后面
    先把各表筛选后,再用条件连接另外,索引也是很有必要的
    最简单的用法就是把连接条件列、明确的筛选列加索引
      

  3.   

    如果楼主是用PLSQL的话可以F5查看一下sql的执行计划 
    看一下哪个子查询的开销比较大 耗时比较多
    一般来说数据量比较大的全表遍历就需要加索引优化一下
    效率优化还是有很多种方式,有的时候考虑建立视图、物化视图也能提升一点效率
      

  4.   

    and (p.dispensing_property='注射类医嘱'  or p.dispensing_property='输液类医嘱')   and o.order_class='A' and o.order_status in (2,3) and h.ward_code = '4232'
    这种限制条件可以放到最后,对sql性能也会有提升,oracle从后面到前面执行sql