在bbb中先建立一个id索引,用下面的试试
select * from aaa,bbb where bbb.id=aaa.id
最好安装一个sql expert for oracle软件,它可以自动优化sql语句

解决方案 »

  1.   

    用select * from aaa where id exists(select * from bbb where aaa.id=bbb.id)
    exists要比in的速度快许多。你可以看看相关资料。
      

  2.   

    在BBB的ID上建立索引,然后:
    SELECT AAA.* FROM AAA, BBB WHERE AAA.ID=B.ID,这样就可以用上索引了,查询也应当很快了~
      

  3.   

    首先在BBB的ID上建立索引,然后同意yjmfdm(SHMILY)的查询意见。
      

  4.   


      不完全同意 yjmfdm的观点.  关于Exist, IN的效率比较,ASKTOM.ORACLE.COM上有相关文章.
      结论是:
       
           内查询为小表, 外查询为大表时, 用 IN 的效率高一些
      反之,内查询为大表, 外查询为小表时, 用 Exist 的效率高一些  这些TOM都给出了测试数据,大家有时间去看看.
     
     
      

  5.   

    b表加索引是必要的但是怎么不试试这个?
    select * from BBB,AAA where BBB.id=AAA.id
      

  6.   

    两个表进行JION时,大表放在前面,JION字段建索引
      

  7.   

    [email protected] >create table emp as select * from scott.emp;表已创建。[email protected] >create table dept as select * from scott.dept;表已创建。[email protected] >update emp set deptno=50;已更新12行。[email protected] >insert into emp select * from scott.emp;已创建12行。[email protected] >insert into emp select * from emp;
             [email protected] >select count(*) from emp;  COUNT(*)
    ----------
       [email protected] >create index ind_dept_deptno on dept(deptno);索引已创建。[email protected] >analyze table dept compute statistics for table for all indexes;表已分析。[email protected] >set timing [email protected] >analyze table emp compute statistics;表已分析。已用时间:  00: 01: 03.02
    [email protected] >select count(*) from emp where deptno in (select deptno from dept);  COUNT(*)
    ----------
        786432已用时间:  00: 00: 09.06Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=899 Card=1 Bytes=15)
       1    0   SORT (AGGREGATE)
       2    1     NESTED LOOPS (SEMI) (Cost=899 Card=1572864 Bytes=23592960)
       3    2       TABLE ACCESS (FULL) OF 'EMP' (Cost=899 Card=1572864 Bytes=3145728)
       4    2       INDEX (RANGE SCAN) OF 'IND_DEPT_DEPTNO' (NON-UNIQUE)[email protected] >select count(*) from emp,dept where emp.deptno=dept.deptno;  COUNT(*)
    ----------
        786432已用时间:  00: 00: 09.02Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=899 Card=1 Bytes=15)
       1    0   SORT (AGGREGATE)
       2    1     NESTED LOOPS (Cost=899 Card=1572864 Bytes=23592960)
       3    2       TABLE ACCESS (FULL) OF 'EMP' (Cost=899 Card=1572864 Bytes=3145728)
       4    2       INDEX (RANGE SCAN) OF 'IND_DEPT_DEPTNO' (NON-UNIQUE)[email protected] >create index ind_emp_deptno on emp(deptno);索引已创建。已用时间:  00: 00: 35.03
    [email protected] >analyze table emp compute statistics for table for all indexes;表已分析。已用时间:  00: 00: [email protected] >insert into emp (empno) values(1);  -- 这样emp.deptno就有为 null 的情况已创建 1 行。  [email protected] >select /*+ use_hash(emp dept) */ count(*) from emp,dept where emp.deptno=dept.deptno;  COUNT(*)
    ----------
        786432已用时间:  00: 00: 02.05Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=308 Card=1 Bytes=15)
       1    0   SORT (AGGREGATE)
       2    1     HASH JOIN (Cost=308 Card=1572864 Bytes=23592960)
       3    2       INDEX (FULL SCAN) OF 'IND_DEPT_DEPTNO' (NON-UNIQUE) (Cost=1 Card=4 Bytes=52)
       4    2       INDEX (FAST FULL SCAN) OF 'IND_EMP_DEPTNO' (NON-UNIQUE) (Cost=297 Card=1572864 Bytes
              =3145728)[email protected] >select /*+ rule */ count(*) from emp,dept where emp.deptno=dept.deptno;  COUNT(*)
    ----------
        786432已用时间:  00: 00: 01.09Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=HINT: RULE
       1    0   SORT (AGGREGATE)
       2    1     NESTED LOOPS
       3    2       TABLE ACCESS (FULL) OF 'DEPT'
       4    2       INDEX (RANGE SCAN) OF 'IND_EMP_DEPTNO' (NON-UNIQUE)优化器没选择正确的驱动表吧
      

  8.   

    同意  内查询为小表, 外查询为大表时, 用 IN 的效率高一些
      反之,内查询为大表, 外查询为小表时, 用 Exist 的效率高一些尽量少用关联
    嵌套比关联效率要高一些象 select * from aaa,bbb where aaa.id=bbb.id  等语句效率极低