`
keepwork
  • 浏览: 334482 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多
开发者博客www.developsearch.com
 
数据库系统中执行一个查询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
执行计划如下:

 

 
 

 

 

 

 

 

 

 

 
 
 
例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会去最小的那个。

 

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

declare
begin
  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  
  2. select emp.deptno,dept,deptno  
  3. from emp,dept  
  4. Query Plan  
  5. SLECT STATEMENT [CHOOSE] Cost=5 
  6. MERGE JOIN CARTESIAN  
  7. TABLE ACCESS FULL DEPT  
  8. SORT JOIN  
  9. TABLE ACCESS FULL EMP 

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

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 31.5 KB
  • 大小: 76.6 KB
  • 大小: 14.3 KB
  • 大小: 17.1 KB
  • 大小: 61.7 KB
  • 大小: 79.7 KB
  • 大小: 55.4 KB
  • 大小: 78.9 KB
  • 大小: 70.4 KB
  • 大小: 63.3 KB
  • 大小: 70.8 KB
分享到:
评论

相关推荐

    cx_Oracle-5.1.2-11g.win-amd64-py2.7.msi

    cx_Oracle是Python的一个第三方库,主要用于在Python应用程序中与Oracle数据库进行交互。 cx_Oracle库允许Python开发者编写高效、简洁的代码来执行SQL查询、事务处理和其他数据库操作。5.1.2是这个库的版本号,11g...

    ORACLE数据库SQL优化---表连接类型.docx

    Oracle支持四种主要的表连接方法: - 排序合并连接(Sort Merge Join):两个已排序的表通过比较键值进行连接,适合大型表且有索引的情况。 - 嵌套循环连接(Nested Loops Join):驱动表的每一行与被驱动表的每一...

    Oracle中表的连接及其调整.

    本文将深入探讨 Oracle 中的三种主要连接方式:嵌套循环连接(Nested Loop)、排序合并连接(Sort Merge)和哈希连接(Hash Join),并结合案例分析其工作原理和优化策略。 1. 嵌套循环连接(Nested Loop) 嵌套...

    哈希表------链表

    哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表

    几种常用的表连接方式

    本文将深入探讨四种常用的表连接方式:嵌套循环连接、排列合并连接、哈希连接以及索引连接,并详细阐述每种连接方式的工作原理、适用场景及其优缺点。 #### 1. 嵌套循环连接(Nested Loop Join) 嵌套循环连接是最...

    oracle-sql资料必备

    - 分区策略:根据业务需求选择分区方法,如范围分区、列表分区、哈希分区等。 8. 数据库备份与恢复: - RMAN(Recovery Manager):Oracle的备份和恢复工具,支持完整备份、增量备份和归档日志管理。 - ...

    ORACLE-pinyin.rar_oracle_拼音

    此函数可能使用了内部的哈希表或者连接到一个外部的汉字拼音资源来获取拼音。拼音首字母的提取对快速搜索很有帮助,例如,我们可以基于拼音首字母进行模糊查找: ```sql SELECT * FROM table WHERE lower(get_...

    oracle-explain.rar_oracle

    - JOIN策略:分析JOIN操作是否高效,例如嵌套循环JOIN、哈希JOIN或归并JOIN的适用性。 4. **使用`EXPLAIN PLAN`的实际案例**: - 分析慢查询:当遇到查询速度慢的问题时,先用`EXPLAIN PLAN`找出问题原因,然后...

    几种常用的表连接方式.doc

    本文档主要介绍了四种常用的表连接方式:嵌套循环连接、排列合并连接、哈希连接和索引连接。 1. **嵌套循环连接**: - 嵌套循环连接是通过遍历外部表(驱动表)的每一行,并与内部表的每一行进行比较来实现的。...

    dba-oracle-sql优化.

    以下是对"dba-oracle-sql优化"这一主题的详细阐述。 一、查询优化 1. **执行计划分析**:理解SQL执行计划是优化的基础,通过EXPLAIN PLAN或EXPLAIN PLAN FOR查看执行路径,找出低效的操作。 2. **避免全表扫描**:...

    某培训机构的Oracle-PPT.rar

    10. **数据库连接与事务**:了解如何通过JDBC、ODBC等方式连接Oracle数据库,以及事务的ACID属性(原子性、一致性、隔离性、持久性),是数据库应用开发的基础。 11. **分区与分片**:对于大型数据库,分区和分片是...

    Oracle SQL表连接技术详解及其应用场景

    内容概要:本文详细介绍了Oracle SQL中的表连接技术,包括常见的连接类型如排序--合并连接(SMJ)、嵌套循环(NL)和哈希连接(HJ)。文中解释了每种连接的工作原理、适用场景以及优缺点,通过具体示例展示了这些...

    ORACLE表连接方式分析及常见用法

    Oracle提供了多种连接类型,包括嵌套循环连接、群集连接、排序合并连接、笛卡尔连接、哈希连接和索引连接。 1. 嵌套循环连接(NESTED LOOP JOIN):这种连接方式适用于外部表小且内部表有高效索引的情况。Oracle会...

    NOI导刊--基础数据结构--哈希、并查集.ppt

    NOI导刊--基础数据结构--哈希、并查集--江涛 内含----讲义,代码

    Oracle-sql-Performance-Tuning-30Tips.rar_oracle_tom kyte

    5. **选择合适的JOIN算法**:了解哈希JOIN、嵌套循环JOIN和排序合并JOIN的适用场景,选择最高效的JOIN方式。 6. **数据分区**:数据分区能有效提高大数据量的查询和维护性能,包括范围分区、列表分区、哈希分区等。...

    jedis-2.9.0.jar及连接池分享

    使用Jedis时,可以通过连接池来管理连接,例如使用`GenericObjectPoolConfig`配置连接池参数,如最大活动连接数、最大空闲连接数、最大等待时间等。然后创建`JedisPool`实例,指定Redis服务器地址、端口、密码等...

    Oracle数据库表连接方式及常见用法

    哈希连接是指 Oracle 优化器通常选择的连接方式。当内存能够提供足够的空间时,哈希连接可以提高查询效率。哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立这张表的基于连接键的哈希表;然后...

    Oracle-SQL性能优化及案例分析.ppt

    如果连接操作成本高,可能需要调整连接顺序或考虑使用连接优化技术,如哈希连接或排序合并连接。 总之,Oracle SQL性能优化是一个涉及多方面因素的过程,需要对数据库结构、查询语法、优化器机制和工具使用有深入的...

Global site tag (gtag.js) - Google Analytics