问题:
我现在有2个表(Table1, Table2),表一有两个整型字段(A1,A2),表2有一个整型字段B1,要求查出全部满足条件的(A1,B1)对,并按B1进行排序。条件为A1和B1都大于0,且A1<B1, 且A1+A2>B1。两个表各有8万条,我现在要用6分钟,太慢了,请帮助改进。
我的SQL语句:
select A1, B1
 from Table1, Table2
 where A1 > 0  
 and   B1  > A1
and  B1 < A1+ A2 
order by B1;
我已经对A1,B1建了索引。

解决方案 »

  1.   

    select A1, B1 
    from Table1, Table2 
    where A1 > 0  
    and  B1  > A1 
    and  B1 < A1+ A2 
    order by B1; 修改成:select * from table1 a
    where exists(select * from table2 b where b.B1>a.A1 and b.B1<a.A1+a.A2)
    and A1>0
      

  2.   

    ojuju10 :
    这样只能返回table1的信息,我要的是全部满足条件的(A1,B1)对
      

  3.   

    调整下条件和表的顺序
    select A1, B1 
    from Table2,Table1 
    where B1 between A1 AND A1+ A2 
    AND A1>0 
    order by B1; 
      

  4.   

    选择最有效率的表名顺序(只在基于规则的优化器中有效)
        ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
        例如:
          表 TAB1 16,384 条记录
          表 TAB2 1      条记录
          选择TAB2作为基础表 (最好的方法)
        select count(*) from tab1,tab2   执行时间0.96秒
          选择TAB2作为基础表 (不佳的方法)
        select count(*) from tab2,tab1   执行时间26.09秒
          如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
      

  5.   

    WHERE子句中的连接顺序。    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
        例如:
     (低效,执行时间156.3秒)
    SELECT … 
    FROM EMP E
    WHERE SAL > 50000
    AND    JOB = ‘MANAGER’
    AND    25 < (SELECT COUNT(*) FROM EMP
                 WHERE MGR=E.EMPNO);
    (高效,执行时间10.6秒)
    SELECT … 
    FROM EMP E
    WHERE 25 < (SELECT COUNT(*) FROM EMP
                 WHERE MGR=E.EMPNO)
    AND    SAL > 50000
    AND    JOB = ‘MANAGER’;
      

  6.   

    bw555 :
    B1 between A1 AND A1+ A2 得改成 B1 between A1+1 AND A1+ A2-1
    但这样测试后并没有提高速度 
      

  7.   

    估计是A1>0在扫描索引,但是又要访问表才能得到A2,
    结果索引没能过滤多少数据,反而增加了ioTable2(A1,A2)建个索引试试能