本帖最后由 sysuscnu 于 2010-11-05 15:47:50 编辑

解决方案 »

  1.   

    把check_time上的的to_char函数去掉,并且建立索引  
    and t.check_time >= to_date('2010-01-01','yyyy-MM-dd')
              and t.check_time <= to_date('2010-11-01','yyyy-MM-dd')
      

  2.   

    1、请问nvl2、decode和case哪个快一点?网上似乎没有定论
    2、请问<>和!=哪个快一点?
    3、请高手们指点一下优化思路,谢谢!
      

  3.   

    这样只是把to_char函数转移到右边啊?
      

  4.   

    最外层查询 
    '出入境人员(人次)' STAT_NAME,IN__PERSION_NONE IN_TOTAL,OUT__PERSION_NONE OUT_TOTAL,IN__PERSION_NONE+OUT__PERSION_NONE IO_TOTAL
    就是把里层查询的 进境和出境查询出来 并加一起成为总数,请问这里可以怎么优化吗?
      

  5.   

    你这个不能想办法group by一下吗?我靠!这样子查,没头了~~
      

  6.   

    我建议你把
     
                   (SELECT COUNT(*) FROM BUS_FOLLOW_SHIPMAN BFM
                      WHERE T.CHECK_DECLARE_ID = BFM.CHECK_DECLARE_ID) IO_PERSION, T.IOTYPE这段子查询也改成join连接
      

  7.   


    oracle 我是为了你建立索引时候可以走索引
      

  8.   


    1.这三个谁快谁慢,对你的SQL影响甚微。你的SQL最大问题是外连接以及  TO_CHAR(T.CHECK_TIME,'YYYY-MM-DD')>='2010-01-01' 这种写法。 1楼YY_MM_DD 说得对,如果你在 T.CHECK_TIME 这一列建了普通索引的话,这种写法是不能使用索引的。另外,日期可以直接比较(日期常量用to_data()来写),无须转成char类型。关于外连接,请慎用。几乎所有外连接的写法都可以写成两个子句UNION ALL在一起的形式。
      

  9.   

    谢谢!
    请问最外层查询  
    '出入境人员(人次)' STAT_NAME,IN__PERSION_NONE IN_TOTAL,OUT__PERSION_NONE OUT_TOTAL,IN__PERSION_NONE+OUT__PERSION_NONE IO_TOTAL
    就是把里层查询的 IN_TOTAL和OUT_TOTAL查询出来 并加一起成为IO_TOTAL,请问这里可以怎么优化吗?
      

  10.   

    请问IN_TOTAL和OUT_TOTAL两个字段对你的外部程序有用么?还是说你只要个 in + out 的总数?如果你只需要总数,直接用 IN__PERSION_NONE+OUT__PERSION_NONE IO_TOTAL 就可以了啊
      

  11.   

    in 、out 、in + out 三个都要的
      

  12.   


    那你这样写就行了,没有什么可优化的。再说select里的内容也不是优化的重点。
      

  13.   

    这样的数据,应该在查询前先分开做统计,把一次性的查询分成几次来做,可能总体时间会长一点,但是在你最终查询的时候会很快。不妨这样试下,定时job结算。
      

  14.   

    你的系统对实时性要求有多高呢,如果语句查询10分钟都没有出结果,那么实时性也谈不上了吧,job定时2、3分钟一次,用merge更新数据,是否满足
      

  15.   


    呵呵,我也有过同样的问题,就是照楼上说的方法建临时表,
    速度肯定是质的飞跃,当然前提是在SQL语句实在无法继续
    优化了。