oracle表连接

1,嵌套循环(nested loops)连接
使用嵌套循环连接是一种从连接结果中提取第一批记录的最快速的方法,在驱动行源表较小,或者内部行源表
已连接的列有唯一的索引或则高度可选的非唯一索引,嵌套循环连接效果是比较理想。
如果 内部行源表已连接的列上不包含索引,或者索引不是高度可选时,嵌套循环连接效率是很低的;如果驱动
行源表非常庞大时,其他的连接方法可能更加有效。
2,排序合并连接(sort-merge join)
在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(超过记录数的5%)时,排序合并连接将比
嵌套循环连接更加有效。排序合并连接只能用于等价连接,排序合并连接需要临时的内存块,以用于排序(sort_area_size过小的话),
导致临时表空间占用更多的内存和磁盘I/O;

3,群集连接(cluster join)
群集连接实际上是嵌套循环连接的一种特例。如果所连接的两张行源表实际上是群集中的表,并且连接是两张行
源表的群集键间的等价连接,那么在oracle中就能使用群集连接。

4,当内存能够提供足够的空间时,哈希连接是oracle优化器通常的选择。在哈希连接中,oracle访问以张表(
通常是连接结果中较小的表),并在内存中建立一张基于连接键的哈希表。然后它扫描连接中其他的表(通常是较大的表)
,并根据哈希表检测是否有匹配的记录。
当缺少索引时,哈希连接比nested loop,sort-merge join更快,因为这种情况下只有一张源表需要排序。哈希连接
也可能比嵌套循环连接更快,因为处理内存中的哈希表比检索B树索引更加迅速。和排序合并索引,群集索引,
哈希连接只能用于等价连接。和排序合并连接一样,哈希连接使用内存资源,并且内存不足时,会增加临时
表空间的I/O(这将使这种连接方法速度变得极慢),最后基于代价的优化器才可以使用哈希连接。
5,索引连接
oracle 8i起,如果哦一组已存在的索引包含了查询所需要的所有信息,那么优化器将在索引中有选择地生产
一组哈希表。可通过范围扫描或则快速全局扫描访问到每一个索引,而选择何种扫描方式取决于where子句的可用
条件,在一张表有大量的列,而你只想访问有限的列的时,这种方法非常有效;where子句约束条件越多,执行速度
越快。
相对于快速全局扫描,连接索引的优势在于:快速全局扫描只有一个单一索引满足整个查询;索引连接可以有多个索引
满足整个查询。


--简要比较
使用资源:
nested loop join
CPU,disk I/O
sort_merge join
内存,临时表空间
hash join
内存,临时表空间
特点:
nested loop join
当有高选择性索引或者进行限制性搜索时效率较高,用于快速返回第一次的搜索结果。
sort_merge join
当缺乏索引或者搜索条件模糊时,该类型的连接比嵌套循环连接有效,可以在有限的内存下工作。
hash join
当缺乏索引或则搜索条件模糊时,该类型的连接比嵌套循环连接有效,通常比排序合并连接快。
缺点:
nested loop join
当索引丢失或者查询条件限制不够时,效率很低。
sort_merge join
所有的表都需要排序,它为最优化的吞吐量而设计,并且在结果没有全部找到前不返回数据。
hash join
为建立哈希表,需要大量内存,第一次的结果返回较慢。如果在磁盘上操作速度将极慢。











posted @ 2011-09-02 15:47  痞子过  阅读(259)  评论(0编辑  收藏  举报