在一个只有1330条记录的表A中有个字段comname,对comname不等于“广州”,“深圳”,“珠海”,“中山”等条件进行筛选数据,使用!=、and进行筛选查询时效率如下:   
                                  
select * from A where comname !='广州';结果:1191条,用时:0.563秒。select * from A where comname !='广州' and A.comname !='深圳';结果:1080条,用时:0.516秒。select * from A where comname !='广州' and A.comname !='深圳' and A.comname !='珠海';结果:1006条,用:13.065秒。        -_-!!!select * from A where comname !='广州' and A.comname !='深圳' and A.comname !='珠海' and A.comname !='中山';结果:974条,用时:25.128秒。    -_-!!!使用not in 进行筛选时和上面大致相同:select * from A where comname not in ('广州');结果:1191条,用时:0.596秒。select * from A where comname not in ('广州','深圳');结果:1080条,用时:0.547秒。select * from A where comname not in ('广州','深圳','珠海');结果:1006条,用时:13.844秒。           -_-!!!select * from A where comname not in ('广州','深圳','珠海','中山');结果:974条,用时:26.145秒。        -_-!!!
同一字段不等于筛选超过2个时,效率明显超低,而且个数越多用时越多。上面的结果都是多次测试,大致用时如上。
请教老鸟们是否遇到同样问题,为什么会这样,怎样去优化?
PS:数据库为oracle 10g。使用工具pl/sql。                        

解决方案 »

  1.   


    --not in后面接的范围越大就越久 要扫描表建索引吧
      

  2.   

    是用 "<> "应该快些吧 如果in 的条件是通过其他表查询出来的建议用 连接查询
      

  3.   


    使用 "<>"的效果是一样的,只是简单的筛选,不是通过其它表查询出来的。
      

  4.   

    当你的not in(....)中的元素的个数很多时,不妨采用临时表。然后两表关联查询。
    该列也得建索引。
      

  5.   

    原则 
    1.不使用like %**%
    2.在where所有常用用到的列上创建索引或组合索引
      

  6.   

    1、!=、<>、not like 等是不能用上索引的。
    2、实际测试了,增加条件性能差别不大,没有遇到你这种情况。
      

  7.   

    注意到LZ的记录数只有1330条,速度怎么会这么慢呢?是不是有lob字段?
      

  8.   


    没有lob字段?
    如果有会怎样?
      

  9.   


    为什么“原则“不使用 like ?
    我最后也是用like应付过去的,还好要筛选的四个有一个相同的字符。
    现在把它贴出来是想请教下高手,到底是什么原因。
      

  10.   


    在java后台遇到的这个问题,上面写的就是我直接在PL/SQL上进行的测试,与后台语言执行无关。
      

  11.   

    pl sql developer里面,选中一个SQL语句,按F5, 然后把执行计划帖出来了。
      

  12.   

    我自己测试这几个查询几乎没什么差别,在1300多条记录的基础上。如果LZ确定查询的是一张表而不是视图,而且这张表中没有大字段没有N多列的话,请LZ去百度搜索人品测试软件,需要的话我可以给个链接,^_^。