分类:
2012-12-23 20:13:34
原文地址:Oracle 4种Join 类型 作者:evan_china
要想了解如何分析执行计划就必须先了解join 的种类及机制,下面对oracle的4中join 方法做个总结。
一、查询优化器如何执行join 语句
在有join的语句中优化器是如何选择执行计划的呢?优化器需要考虑选择什么访问路径?选择什么join 方法?选择什么join顺序?
那么优化器是如何选择执行计划的呢?
1. 优化器首先要判断是join两张表还是多张表。对于多张表,优化器会把有唯一约束或主键的表放在前面,然后处理后面的表。
2. 对于有outer join条件的语句,有outer join条件的表将放在后面。当一个子查询已经转化为一个表时,子查询的表必须在outer join的后面。
优化器根据可能的join顺序,join 方法和可用的访问路径会产生很多的执行计划后,优化器需要评估每个执行计划的成本,并选择最低的一个作为最终执行计划,对于成本的评估方法是:
1. nested loop join的成本是基于读取外表的每一行并和在内存里的内表一一匹配的成本,优化器通过统计信息来评估该成本。
2. sort merge join的成本主要在读所有的数据到内存并进行排序。
3.hash join的成本主要在建立hash表。
同时优化器还会考虑小的sort area size将增加sort merge join的成本,因为在小的sort area里面将花费更多的CPU和IO。相比与nest loop join大multiblock读将提高sort merge join的性能。
二、join 的种类
1. nested loop join
当小数据量的表被join时,并且join的条件能非常有效和和第二个表建立关联,使用nest loop join将非常有效。
使用nest loop join的关键是inner表必须依赖于outer表,否则使用hash join将更加高效。
nest loop join涉及到以下步骤:
A. 优化器决定驱动表并指定它为outer表
B. 其它表被指定为inner表
C. oracle 先取outer表一行数据再和inner表的每一行数据进行匹配,再取outer表第二行和inner表的每一行进行匹配,知道内外都循环完。
在执行计划中outer loop在上面,inner loop在下面: