a(a1,a2,a3,a4)
b(b1,1b2,b3,b4,b5)
所有字段都是number型要求查询b1中有但是a1中不存在的表a的记录
select * from a where a.a1 not in (select b1 from b)
但是这两个表的记录都有500万条,上边查询速度非常慢
有没有办法快一点select * from a where a.a1 in (select b1 from b)
如果用in的话可以用到索引,但是如果用not in 就用不到索引,
这是为什么?

解决方案 »

  1.   

    用Oracle里面的 外连接 是不是能快点呢?
      

  2.   

    select  * from a  where not exists (select 1 from b where b.b1 = a.a1)
      

  3.   

    用exists 应该比in 效率高一些
      

  4.   

    这种情况外连接最适合:SELECT a1,a2,a3,a4
      FROM b
      LEFT OUTER JOIN a
      ON(a.a1=b.b1)
    WHERE a.a1 IS NULL;
      

  5.   

    A表A1 VARCHAR2(12) N
    A2 NUMBER(15) N
    A3 NUMBER(15) N
    A4 NUMBER(16) Y
    A5 NUMBER(16,2) Y
    A6 NUMBER(8) Y
    A7 NUMBER(16,2) Y
    索引:
    A I_A_1 Normal A3
    A I_A_2 Normal A1, A6
    A I_A_3 Normal A1, A2, A3, A6
    A PK_A Unique A1, A2, A3
    B表
    B1 VARCHAR2(12) N
    B2 NUMBER(5) N
    B3 NUMBER(15) N
    B4 NUMBER(10,2) Y
    B5 NUMBER(10,2) Y
    B6 NUMBER(8) N 索引:
    B PK_B Unique B1, B3, B6 在这两个表中
    A1=B1,A2=B2,A3=B3
    但是表B中的记录比A中少,要求查询出表A中A3存在,但是表B中B3不存在的表A中的所有记录
    select A3,A7 FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE A.A3=B.B3)
    SELECT A3,A7 FROM A WHERE A3 NOT IN (SELECT B3 FROM B)
    用上边这两个语句速度都很慢,表A中有500万条记录,表B中有10万条记录。
    到底应该如何查询啊?
    请各位高手不吝赐教,多谢!
      

  6.   

    试试这个吧
    select * from a,b where b.b1=a.a1(+) and a.a1 is null;