一条复杂的sql,求优化 本帖最后由 sysuscnu 于 2010-11-05 15:47:50 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把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') 1、请问nvl2、decode和case哪个快一点?网上似乎没有定论2、请问<>和!=哪个快一点?3、请高手们指点一下优化思路,谢谢! 这样只是把to_char函数转移到右边啊? 最外层查询 '出入境人员(人次)' STAT_NAME,IN__PERSION_NONE IN_TOTAL,OUT__PERSION_NONE OUT_TOTAL,IN__PERSION_NONE+OUT__PERSION_NONE IO_TOTAL就是把里层查询的 进境和出境查询出来 并加一起成为总数,请问这里可以怎么优化吗? 你这个不能想办法group by一下吗?我靠!这样子查,没头了~~ 我建议你把 (SELECT COUNT(*) FROM BUS_FOLLOW_SHIPMAN BFM WHERE T.CHECK_DECLARE_ID = BFM.CHECK_DECLARE_ID) IO_PERSION, T.IOTYPE这段子查询也改成join连接 oracle 我是为了你建立索引时候可以走索引 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在一起的形式。 谢谢!请问最外层查询 '出入境人员(人次)' 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,请问这里可以怎么优化吗? 请问IN_TOTAL和OUT_TOTAL两个字段对你的外部程序有用么?还是说你只要个 in + out 的总数?如果你只需要总数,直接用 IN__PERSION_NONE+OUT__PERSION_NONE IO_TOTAL 就可以了啊 in 、out 、in + out 三个都要的 那你这样写就行了,没有什么可优化的。再说select里的内容也不是优化的重点。 这样的数据,应该在查询前先分开做统计,把一次性的查询分成几次来做,可能总体时间会长一点,但是在你最终查询的时候会很快。不妨这样试下,定时job结算。 你的系统对实时性要求有多高呢,如果语句查询10分钟都没有出结果,那么实时性也谈不上了吧,job定时2、3分钟一次,用merge更新数据,是否满足 呵呵,我也有过同样的问题,就是照楼上说的方法建临时表,速度肯定是质的飞跃,当然前提是在SQL语句实在无法继续优化了。 在网页中怎样连接oracle数据库? 请问怎么让触发器停止运行? 100分求教FROM的条件查询问题! 有存储过程经验请进~~可以迭代否? 存储过程和事务的关系 SMON问题 初学者问题 用OCI查询怎样获取查询的列数、列名、数据类型? 如何用PL/SQL语句把一个数据表LONG数据类型的数据转到另一张表的LONG字段中去? 交叉查询 ORACLE中如何实现自增字段: oracle数据迁移
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、请问<>和!=哪个快一点?
3、请高手们指点一下优化思路,谢谢!
'出入境人员(人次)' STAT_NAME,IN__PERSION_NONE IN_TOTAL,OUT__PERSION_NONE OUT_TOTAL,IN__PERSION_NONE+OUT__PERSION_NONE IO_TOTAL
就是把里层查询的 进境和出境查询出来 并加一起成为总数,请问这里可以怎么优化吗?
(SELECT COUNT(*) FROM BUS_FOLLOW_SHIPMAN BFM
WHERE T.CHECK_DECLARE_ID = BFM.CHECK_DECLARE_ID) IO_PERSION, T.IOTYPE这段子查询也改成join连接
oracle 我是为了你建立索引时候可以走索引
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在一起的形式。
请问最外层查询
'出入境人员(人次)' 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,请问这里可以怎么优化吗?
那你这样写就行了,没有什么可优化的。再说select里的内容也不是优化的重点。
呵呵,我也有过同样的问题,就是照楼上说的方法建临时表,
速度肯定是质的飞跃,当然前提是在SQL语句实在无法继续
优化了。