Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103647558
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-04 14:09:14


总结一下,在哪种情况下用哪种连接方法比较好:
  排序 - - 合并连接:
  (a) 对于非等值连接,这种连接方式的效率是比较高的。
  (b) 如果在关联的列上都有索引,效果更好。
  (c) 对于将2个较大的row source做连接,该连接方法比NL连接要好一些。
  (d) 但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库性能下降,因为过多的I/O。
  嵌套循环
  (a) 如果driving row source(外部表)比较小,并且在inner row source(内部表)上
  有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。
  (b) NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经
  连接的行,而不必等待所有的连接操作处理完才返回数据,
  这可以实现快速的响应时间。
  哈希连接(Hash Join, HJ):
  (a) 这种方法是在Oracle(大型网站数据库平台)7后来引入的,使用了比较先进的连接理论,
  一般来说,其效率应该好于其它2种连接,但是这种连接只能用在
  CBO优化器中,而且需要设置合适的hash_area_size参数,
  才能取得较好的性能。
  (b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个
  row source较小时则能取得更好的效率。
  (c) 只能用于等值连接中
  笛卡儿乘积
  当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量使用笛卡儿乘积,否则,自己想结果是什么吧!
  注意在下面的语句中,在2个表之间没有连接。
SQL> explain plan for
select emp.deptno,dept,deptno
from emp,dept
Query Plan
------------------------------
SLECT STATEMENT [CHOOSE] Cost=5
 MERGE JOIN CARTESIAN
  TABLE access(小型网站之最爱) FULL DEPT
  SORT JOIN
   TABLE access(小型网站之最爱) FULL EMP
  CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行,dept表有m行,笛卡尔乘积的结果就是得到n * m行结果。
阅读(251) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~