首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)

2013-10-31 
Oracle--三种连接方法(哈希连接、嵌套连接、笛卡儿乘积)?例1:使用leading与use_n1来强制使用嵌套循环连接lea

Oracle--三种连接方法(哈希连接、嵌套连接、笛卡儿乘积)

?例1:使用leading与use_n1来强制使用嵌套循环连接leading提示要求先访问表t1,也就是它指定了哪张表作为外部循环表使用use_nl提示指定了具体使用哪种连接方法来将内部循环返回的数据(表t2)与表t1连接起来有必要指出的是:use_nl提示并没有引用t1

SELECT /*+ leading(t1) use_nl(t2) full(t1) full(t2) */*FROM t1,t2 WHERE t1.id = t2.id AND t1.n = 19
执行计划如下:Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
??
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
?
Oracle-三种联接方法(哈希连接、嵌套连接、笛卡儿乘积)
???例2:
select a.*, b * from EMP a, DEPT b where a.DEPTNO = b.DEPTNO;
如使用emp表为出发点,将emp表的记录都查询出来为m条,再将这m条记录的字段deptno值,逐条和dept表的所有记录的deptno字段值匹配,假如dept表有n条记录。匹配出来的记录符合条件就写入到结果集中。那么这样关联操作过程中,操作的记录条数就是:先是emp表的m条,接着是dept表n条,但查了m遍,总的记录数就是m+m*n。如使用dept表为出发点,去遍历emp表,那么总的记录数就是n+n*m。出发点不同的连接方法,需要的成本就是不一样的。CBO会去最小的那个。

?

使用伪代码来表示一下嵌套循环连接

declarebegin  for outer_table in (select * from emp) loop     for inner_table in (select *                          from dept                                                 where DEPTNO = outer_table.DEPTNO) loop      dbms_output.put_line(inner_table.*, outer_table.*);    end loop;  end loop;end;
???????

?

?

---------------------------------------------哈希连接

?a) 这种方法是在Oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。

b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。

c) 只能用于等值连接中

?

?

?

?

?

?

?

?---------------------------------------------笛卡儿乘积

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

注意在下面的语句中,在2个表之间没有连接。

  1. SQL>?explain?plan?for ?select?emp.deptno,dept,deptno ?
  2. from?emp,dept ?Query?Plan ?
  3. SLECT?STATEMENT?[CHOOSE]?Cost=5?MERGE?JOIN?CARTESIAN ?
  4. TABLE?ACCESS?FULL?DEPT ?SORT?JOIN ?
  5. TABLE?ACCESS?FULL?EMP?

CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行,dept表有m行,笛卡尔乘积的结果就是得到n * m行结果。

?

?

?

?

?

?

?

?

?

?

?

热点排行