ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle执行计划九

oracle执行计划九

原创 Linux操作系统 作者:leonwoo 时间:2008-06-17 13:39:34 0 删除 编辑
内存中时,这种查找方法更为有用。这种连接方法也有NL连接中所谓的驱动表的概念,被构建为hash table与bitmap的表为驱动表,当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。

HASH
连接的例子:
SQL> explain plan for
select /*+ use_hash(emp) */ empno
from emp, dept
where emp.deptno = dept.deptno;

Query Plan
----------------------------
SELECT STATEMENT  [CHOOSE] Cost=3
  
HASH JOIN
    TABLE ACCESS FULL DEPT
    TABLE ACCESS FULL EMP

       
要使哈希连接有效,需要设置HASH_JOIN_ENABLED=TRUE,缺省情况下该参数为TRUE,另外,不要忘了还要设置hash_area_size参数,以使哈希连接高效运行,因为哈希连接会在该参数指定大小的内存中运行,过小的参数会使哈希连接的性能比其他连接方式还要低。

总结一下,在哪种情况下用哪种连接方法比较好:
排序 - - 合并连接(Sort Merge Join, SMJ):
        a)
对于非等值连接,这种连接方式的效率是比较高的。
        b)
如果在关联的列上都有索引,效果更好。
        c)
对于将2个较大的row source做连接,该连接方法比NL连接要好一些。
        d)
但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库性能下降,因为过多的I/O。
嵌套循环(Nested Loops, NL):
        a)
如果driving row source(外部表)比较小,并且在inner row source(内部表)上
有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。
        b) NESTED LOOPS
有其它连接方法没有的的一个优点是:可以先返回已经
连接的行,而不必等待所有的连接操作处理完才返回数据,
这可以实现快速的响应时间。
哈希连接(Hash Join, HJ):
        a)
这种方法是在oracle7后来引入的,使用了比较先进的连接理论,
       
一般来说,其效率应该好于其它2种连接,但是这种连接只能用在
        CBO
优化器中,而且需要设置合适的hash_area_size参数,
       
才能取得较好的性能。
b)
在2个较大的row source之间连接时会取得相对较好的效率,在一个
row source
较小时则能取得更好的效率。
c)
只能用于等值连接中

笛卡儿乘积(Cartesian Product)
       
当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量使用笛卡儿乘积,否则,自己想结果是什么吧!

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/79730/viewspace-350525/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle执行计划八
下一篇: oracle→mysql
请登录后发表评论 登录
全部评论

注册时间:2008-06-16

  • 博文量
    20
  • 访问量
    14330