刚才在网上看到如下,
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.oracle解析器解析的方式是怎么样的? 能说一说为什么需要把记录条数最少的表作为基础表.我已经测试了 确实 记录条数最少的表作为基础表比数据多的表作为基础班效率快得多,但我想知道原因?原文地址:
http://www.cnblogs.com/zhougb/archive/2009/05/05/1449708.html
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.oracle解析器解析的方式是怎么样的? 能说一说为什么需要把记录条数最少的表作为基础表.我已经测试了 确实 记录条数最少的表作为基础表比数据多的表作为基础班效率快得多,但我想知道原因?原文地址:
http://www.cnblogs.com/zhougb/archive/2009/05/05/1449708.html
--例如: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的索引,很快便能返回数据
没有吧,只是为了性能而已
假设a表1千万条
b表10万条
a上有没有索引
b上有索引
而且、查询依赖以索引
则,驱动表会是b、而不是a
(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>