ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名

刚才在网上看到如下,
  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.


oracle解析器解析的方式是怎么样的? 能说一说为什么需要把记录条数最少的表作为基础表.


我已经测试了 确实 记录条数最少的表作为基础表比数据多的表作为基础班效率快得多,但我想知道原因?



--例如: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的索引,很快便能返回数据


刚才在网上看到如下,
  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 
在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表

你可能感兴趣的:(数据库)