select * from t1 where ybh in('2010334','2010998','2010394','2010700')可能in 后面的括号里有100多个值ybh 是主键请问能不能把这语句改成用exists语句该怎么写效率才会高一点

解决方案 »

  1.   

    exists需要连接条件,你这个是具体值,故无法改为exists
    贴出执行计划,ybh是主键,应该是index range scan。另外,把*替换为具体列名,*不应该出现在生产环境代码里。
      

  2.   

    *,在编译时还要转换为具体的列名称。无法用EXISTS !!建立索引试试
      

  3.   

    如果能把这些值放入一个临时表中,还是可以改成exists的
      

  4.   

    不可以,因为exists需要连接条件
      

  5.   

    100个值,exists的效率应该不会更高,就用in好了
      

  6.   

    其实把那100个值放在一个文件里面,或者放在一个表里面,然后关联查询这样效率比较高...如果放在一个文件里面的话,例如TXT文件,可以通过ORACLE建立外部表...然后与主表关联就可以了.之所以放在一个文件里面,这样是为了程序操作方便,我想你括号里面的数据可能会变换的...,如果不懂得建立外部表的话,就建立一个基本表好了,,,记得关联的时候用左外连接,这样效率也会提高...例如新表为   create table test
    (
      id varchar2(7)
    )INSERT INTO TEST VALUES('.......');
    INSERT INTO TEST VALUES('.......');
    INSERT INTO TEST VALUES('.......');
    INSERT INTO TEST VALUES('.......');
    .....
      select * from t1 left outer join test on t1.ybh=test.id where test.id is not null;  因为是唯一的值的,所以这里也可以不用外连接  直接:
      select * from t1 , test where t1.ybh=test.id 
      

  7.   

    如果 t1 很大的话 改成exists说不定效率更低
      

  8.   

    用exists的话会对t1全表扫描,
    而用in的话 yhb是主键,会使用 索引
      

  9.   

    并不是任何时候exists都比 in快
      

  10.   

    T1表有几百万条数据,用in,但是需要索引,而且是必须需要!