表system_graduate有120万数据select count(*) from system_graduate where 1=1 and c_name like'%李%';
执行需要5秒
select * from system_graduate where 1=1 and c_name like'%李%';
执行需要0.125秒
select * from system_graduate where 1=1 and c_name like'%李%' order by c_id;;
执行需要5秒 请高手指点

解决方案 »

  1.   

    第一和第三句走全表掃描,
    第二句在first_row模式下會很快取得結果集的前部分,但如果要全部顯示出來,估計也要5秒
      

  2.   

    有道理!
    120万的数据,70个字段,有很多查询条件,好几个是like查询
    请问有什么办法优化性能吗?
    目前我们程序查询下来需要40秒左右
    oracle不懂,请高手帮忙想个方案
      

  3.   

    對經常查詢的條件的字段做index吧,但用到like就沒辦法使用index了。
      

  4.   

    一定要用LIKE么.这个有点影响速度....
      

  5.   


    --创建临时表:表复制的速度比查询要快的多!
    create table t_temp as select * from system_graduate where 1=1 and c_name like'%李%';--使用时:
     select * from t_temp;  --使用此查询行了! 速度应该很快的!
      

  6.   

    问题解决了
    网上查的都不一定正确啊,特别是关于oracle优化的,都抄来抄去的
    下面是我自己测试以后得出的结论:
    环境:oracle10g
    oracle10g对like查询肯定是优化了,不需要全表检索,秒杀级的
    一直以来认为的"="是很快的,但是在oracle10g里都要进行全表扫描
    in查询也是要全表扫描
    所以,对需要进行"="和in查询的列建索引,就都是秒杀级了
    产生一个新问题是:count(*)比较慢,解决方案需要再查找.说这么多,就想给我一样碰到问题的人一个参考!
    先不结帖,等那个count(*)问题解决了再结帖
      

  7.   

    可以很明确的告诉你,oracle不止对like做了优化,对所有查询都做了优化,秒杀级的查询多得很呢。
    = 和 in 是不是走全表扫描,要看你有没有索引,查询语句和查询结果,你确定你自己做的测试涵盖了所有情况吗?
    count(*)没有办法进行优化,oracle的计算能力还不是最顶尖的。
      

  8.   

    where 1=1 and c_name like'%李%';
    索引不能起作用,但是改成这样
    where 1=1 and c_name like'李%';
    就可以起作用了。
    就是查‘李’开头的是可以的,但是查包含‘李’和以‘李’结尾的都是不行 的
      

  9.   

    看说话的语气是个牛人啊
    "你确定你自己做的测试涵盖了所有情况吗?",这句话又像在责怪我.
    我只想说一句:不要把自己整得那么牛b行吗?我一个小菜鸟,不懂了就在csdn上提问,解决问题的过程中找到一些有用的(或者我本人是这么认为)心得经验.发上来给跟我一样碰到这样的问题的人一个参考.本来很简单的一件事情.你要是觉得我技术上说得不对,就指出来.非得把自己整到天上,然后在对着地球人说话一样的气势,真可笑!
      

  10.   

    count(*)换成 count(主键索引)试一下
      

  11.   

    我有一张2千万的数据表,在经常查询的字段上建了索引,where 条件都是用in的,但是也没见效率提高啊!