现在的位置: 首页 > 综合 > 正文

对oracle执行计划相关概念的理解

2013年09月05日 ⁄ 综合 ⁄ 共 1422字 ⁄ 字号 评论关闭
 

    驱动表(driving table)和被探查表(probed table)的概念
驱动表又称为外层表(outer table),这个概念用于嵌套与hash连接中,如果驱动表row source返回较多的行数据,则对所有的后续操作都有负面的影响,因为将大的row source作为驱动表时在后续的操作中返回的中间结果都比较大。这是比较容易理解的。
另外在驱动表的选择上,应该选择经限制条件选择之后结果集比较小的row source作为驱动表,而不是单纯选择原始数据较小的数据表作为driving table。
驱动表的识别,在执行计划那个,靠上的那个row source应该是驱动表,一般都是在from关键字后靠前位置的表。
    表之间的连接
目前为止,无论连接操作符如何,典型的连接类型有三种:
排序――合并连接(sort merge join(SMJ))
内部连接过程为:1,先生成驱动数据,然后对这些数据按照连接操作关联列进行排序;2,生成被探查数据,然后对这些数据按照连接操作关联列进行排序;3,对已经排序的两个结果放在一起执行合并操作。
排序是一个费时、费资源的操作,特别对于大表。基于这个原因,SMJ经常不是一个特别有效的连接方法,但是如果2个row source都已经预先排序,则这种连接方法的效率也是比较高的。
优点:1,对于非等值连接,效果较高,2,如果关联列上都有索引,效果更好;3,如果两个row source都比较大,本方法要稍好于NL;4,如果返回的row source过大则又会导致过多的IO。
嵌套循环(Nested loops NL
内部连接过程,是对驱动数据源的每一行数据去遍历被探查数据源。
一个习惯性的指导原则是利用较小的数据源作为驱动数据源,因为遵循这种原则时nl连接查询往往需要较少的IO次数,但也不尽然,有时又可能得到相反的结果,所以在判断时需要根据查询统计结果中实际执行的IO次数来判断该选择那个数据源作为驱动数据源。
习惯原则:如果驱动数据源较小,并且在被探查数据源上有唯一索引,或者有高选择性的非唯一索引时,使用这种方法可以得到较好的效率。
另外,NL连接方法的一个优点是:可以返回已经连接的行,而不必等待所有的连接操作处理完成之后才返回数据,这可以实现快速的响应时间。
优点:如果驱动数据源比较小,而且被探查数据源有唯一索引或者高选择性的非唯一索引,这种方法可以得到较好的效果;2,可以返回已经连接的行而不必等待所有的连接操作处理完才返回数据。
哈希连接(Hash Join,HJ
这种连接从理论上说比NL和SMJ更有效,而且只能在CBO优化器中。
较小的row source被用来构建hash table与bitmap,第二个row source被用来被hashed,并与第一个row source生成的hash table进行匹配,以便进行进一步的连接。Bitmap被用来作为一种比较快的查询方法,来检查在hash table中是否有匹配的行。
当hash table比较大而不能全部容纳在内存中时,这种方法特别有用,而当hash join和bitmap可以被容纳在内存中时这
种连接方式的效率极高。
需要设置hash_join_enabled=true和hash_area_size参数以使得hash连接高效运行。
优点:在两个较大的row source之间连接时会取得较好的效率,在一个row source较小时会取得更好的效率;2,只能用于等值连接。
 
 
 
 
 
 

抱歉!评论已关闭.