日期:2014-05-16  浏览次数:20635 次

Oracle--三种连接方法(哈希连接、嵌套连接、笛卡儿乘积)
在数据库系统中执行一个查询SQL语句,如果这个查询只操作一张表,那么仅仅涉及到这个表及关联对象的访问。
访问方式通常是三种:全表扫描、全索引扫描和索引扫描。
如果这个查询操作两张及以上的表,那么需要操作的表之间的连接关系就变得至关重要。
数据库系统执行该SQL时,永远都是两个结果集关联。
?
例如,
操作三张表,那么就是其中两张表关联出一个结果集,和第三张表关联。
操作四张表,那么就是其中两张表关联出一个结果集,和第三张表关联出一个结果集,再和第四张表关联出最后的结果集。当然也可能是两两关联出两个结果集,再相互关联得到最后的结果集。
操作五张表,各个表之间的关联方式就更复杂了。
?
这些描述就是数据库系统用来根据操作表的不同排列和组合而生成不同的执行计划。
Oracle数据库系统会使用一种机制,来决定哪一种组合性能最好。这种机制称为基于成本的优化器(Cost-Based Optimization,简称为CBO)。
?

---------------------------------------------嵌套连接

??嵌套循环,顾名思义就是将一个表为出发点,将该表全部记录逐条去遍历另外一张表的记录,符合条件的就是写入结果集。

?基于嵌套连接的特点,我们可以想得到,它在两个关联表的数据量相差比较大时采用,但整体上数据量都不应该太大。
?该关联方式适用于得到小数据量的查询操作。


?
例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
执行计划如下:

?
?