最近要优化Oracle数据库的效率,然后在网上查了很多判断记录是否存在的高效率方法
网上有很多的建议第一种方法,我做了一个测试,但是可能数据量不够大,42667条记录,不知道很大的数据量是什么一个情况网上好多高效的建议方式
select * from item where item='1B241371X0021' and rownum<2;
但是我测试的结果:
select * from item where item='1B241371X0021' and rownum<2;1 rows selected in 0.047 secondscount(*) 方式
select count(*) from item where item='1B241371X0021';1 rows selected in 0.016 secondsexists方式
select count(*) from dual where exists(select 1 from item where item='1B241371X0021');1 rows selected in 0.015 seconds从测试的结果看,后两种方式比前一种方式的效率明显要高.

解决方案 »

  1.   

    这3个sql是否在不同的session下面跑的呢?同一个session下出来的时间不说明什么的
      

  2.   

    多个session结果也是一样的.
    后两种的效率比第一种要高
      

  3.   

    如果只是为了判断存在性
    后两种根据索引判断返回个数,第一种要访问表查出具体的记录数据
    你试试
    select 1 from item where item='1B241371X0021' and rownum =1
    试试这个如何
      

  4.   


    这个的效率介于第一种和二种中间,0.031seconds
      

  5.   

    存在的可以用count来做也可以直接来进行查询。这里加rownum<2只是过滤结果集而已,不必要返回多余的数据了。有一条就说明有数据了。如果是count,以前有专贴研究过的。参考
    http://topic.csdn.net/u/20090617/16/401ea743-48fa-4449-ab85-6e955fea1a01.html
      

  6.   

    where exists(select 1 from item where item='1B241371X0021'); 
    还是这种方法好。。
      

  7.   

    select * from item where item='1B241371X0021' and rownum <2; 
    这个sql语句,为什么用表item='1B241371X0021'来判断呢,item不是表名字吗?item是字段?
      

  8.   

    看plsql dev显示的时间不准的,建议不要以它为依据;
      

  9.   

    在一张有530多万条记录的表中进行检验(关键字上未建任何索引):
    1、如何查询结果不存在,这三种查询方法效率相差不多。
    2、在有查询结果时,第一种与第三种select * from item where item='1B241371X0021' and rownum <2; select count(*) from dual where exists(select 1 from item where item='1B241371X0021'); 
    效率较高,
    count(*) 方式 
    select count(*) from item where item='1B241371X0021'; 
    效率较差。
    从常识上理解也是这样,第一种与第三种方法只要找到第一条记录即可,第二种方法要找到所有记录,所以要慢,除非只有一条符合条件的记录。
      

  10.   

    楼主有没有考虑大数据量的问题呢?? 一般查询中尽量少用像  in 或者 exist这样的函数,当大数据量时 ,性能下降很厉害