驱动表( driving table/outer table)又称为外层表,驱动表是用来驱动查询的,驱动表仅仅用于 nested loops join和 hash join 驱动表是在使用多表嵌套连接时,会先全表扫描该驱动表,然后驱动表返回的结果集中一行行去匹配被驱动表(可以利用索
引),所以我们会选择小表做为驱动表,而被驱动使用索引进行连接。
对于基于规则RBO的优化系统,驱动表在FROM后是有次序设置的
而在基于成本CBO的优化, ORACLE会选择最合适的驱动表。
1、在CBO中,优化器会根据cost自动选择驱动表,与表的顺序无关
通常情况下,驱动表的选择性较高, where中的限制条件较多,返回的行数较少的表适合做驱动表,不但小表适合做驱动表事实上,大表有时候也会做驱动表,只要在大表上面限制条件较多,从大表上面返回的行数较少的话,大表也适合做驱动表始终要记住的就是返回的结果集较小的表适合做驱动表,我们在看执行计划的时候,离 nested loops, hash join近的表就是驱动表,也就是说执行计划中靠上的表是驱动表
2、RBO,对于2个表的操作,FROM子句中,RBO选择最右的表作为驱动表(般也就是from中最后的表作为驱动表)。所以对于 NESTED LOOPS、 HASH JOIN、 SORT MERGE JOIN方式,驱动表选择较小的表(放在from最右端),速度会更快存在主、外键关系的表,由于主键由 oracle自动建立索引,外键上最好也建索引,以避免全表扫描。而对于3个或以上table连接查询,
对于FROM子句
RBO以从右到左的顺序处理表连接,也就是from子句最右端 table作为驱动表,from后边表从右向左遍历。
3、以下是几个快速判断驱动表的经验:
(1)用于连接的子句的列应被索引、在 Where子句中应尽量利用索引,而不是避开索引
(2)连接操作应从返回较少行上驱动
(3)如果所连接的表A和B,A表长度远远大于B表,建议从较大的A表上驱动
(4)如果 Where子句中含有选择性条件, Where No=20,将最具有选择性部分放在表达式最后
(5)如果只有一个表有索引,另一表无索引,无索引的表通常作为驱动表。如A表的No列以被索引而B表的No列没被索引,则应当B表作为驱动表,A表作为被驱动表




