刚才在网上看到如下,
  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.oracle解析器解析的方式是怎么样的? 能说一说为什么需要把记录条数最少的表作为基础表.我已经测试了 确实 记录条数最少的表作为基础表比数据多的表作为基础班效率快得多,但我想知道原因?原文地址:
http://www.cnblogs.com/zhougb/archive/2009/05/05/1449708.html

解决方案 »

  1.   


    --例如:A(id,name)表100W条数据, 字段id上有索引
    --      B(id,score)表10W条数据,字段score上有索引
    --查询语句:
    select *
      from A,B
     where A.id = B.id
       and B.score = 100;
    --分析
    --1、A表作为驱动表,先查A表一条数据,然后看B和B表id 是否相等,相等了再看B表score是不是等于100
    ----应该比较100W次(实际上oracle不会这么傻,但是你可以这么理解)
    --2、B表作为驱动表,先利用score=100 的索引过滤一部分数据,假如剩下 10条
    -----这10条的id就拿到了,然后利用A表id的索引,很快便能返回数据
      

  2.   


    没有吧,只是为了性能而已
    假设a表1千万条
        b表10万条
        a上有没有索引
        b上有索引
        而且、查询依赖以索引
        则,驱动表会是b、而不是a
      

  3.   

    而且,如果你设置了hint,则也是会改变驱动表的可能
      

  4.   

    2楼的 BenChiM888 还是不太明白.select *   from A,B  如果没有查询条件的时候 能不能给分析一下呢。
      

  5.   

    SQL查询处理的步骤序号:
    (8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
    (1) FROM <left_table>
    (3) <join_type> JOIN <right_table>
    (2) ON <join_condition>
    (4) WHERE <where_condition>
    (5) GROUP BY <group_by_list>
    (6) WITH {CUBE | ROLLUP}
    (7) HAVING <having_condition>
    (10) ORDER BY <order_by_list>