在多表联合查询的时候,如果我们查看它的执行计划, 就会发现里面有多表之间的连接方式 多表之间的连接有三种方式: Nested Loops,Hash Join 和 Sort Merge Join. 具体适用哪种类型的连接取决于: * 当前的优化器模式 (ALL_ROWS 和 RULE) * 取决于表大小 * 取决于连接列是否有索引 * 取决于连接列是否排序
1 hash join
使用情况:Hash join在两个表的数据量差别很大的时候.(小表一般会丢在内存中)
2 merge join
Merge Join 是先将关联表的关联列各自做排序, 然后从各自的排序表中抽取数据,到另一个排序表中做匹配。 适用情况: 1.RBO模式 2.不等价关联(>,<,>=,<=,<>) 3.HASH_JOIN_ENABLED=false 4. 用在没有索引,并且数据已经排序的情况.
3.nested loop
Nested loops 工作方式是循环从一张表中读取数据(驱动表outer table), 然后访问另一张表(被查找表 inner table,通常有索引)。 驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。 适用情况: 适用于驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index), 并且索引选择性较好的时候. JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。