有两张表table_a,table_b  
其中表table_a有列a_1,a_2,a_3,a_4;
表table_b有列b_1,a_1,a_2.
但是表table_b数据量特别大,有索引a_1,a_2.
小弟做了个查询
select a.a_1,a.a_2,a.a_3,a.a_4,b.b_1 from table_a a,table_b b where a.a_4 = 3 and a.a_1 = b.a_1
结果因为表table_b特别大,查询速度特别慢.现在想优化下,让查询速度快些,不知道该怎么办?
请各位大侠帮忙!
已知表table_a的a_4=3

解决方案 »

  1.   

    我想查询慢的原因在于查询时先发生了表扫描。你是不是可以试试这样写SQLselect a.a_1,a.a_2,a.a_3,a.a_4,b.b_1
      from (select * from table_a where a_4 = 3) a,table_b b
     where a.a_1 = b.a_1 
    ------------------------------------------------------------
    你可以把你的SQL放在PL/SQL 的SQL Window中,按F5查看对SQL的分析情况。
      

  2.   

    select   a.a_1,a.a_2,a.a_3,a.a_4,b.b_1   
       from   table_b   b,table_a   a   
       where  a.a_1   =   b.a_1 and a.a_4   =   3 where条件的执行顺序是:从where语句条件的最后一个开始逐渐执行,因此希望楼主把能把范围缩小到最小的条件放在where语句的最后,具体条件,楼主可以根据自己的情况自己写。 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秒