zoukankan      html  css  js  c++  java
  • Oracle 表的连接方式

    1. 连接说明

    ① Oracle一次只能连接两个表。不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表。

    ② 当执行多个表的连接时,优化器从一个表开始,将它与另一个表连接;然后将中间结果与下一个表连接,以此类推,直到处理完所有表为止。

    2. 连接方式

    ▶ 嵌套循环连接(NESTED LOOP JOIN)

    ▶ 排序合并连接(SORT MERGE JOIN)

    ▶ 哈希连接(HASH JOIN)

    ▶ 笛卡尔积连接(CARTESION JOIN )

    2.1 NESTED LOOP JOIN

    ① Oracle优化器基于规则RBO或基于成本CBO的原则,选择两张表中的一张作为驱动表,驱动表也叫做外部表;再将另外一张表指定为外部表;

    ② Oracle从外部表中读取第一行,然后和内部表中的数据逐一对比,所有匹配的结果放在结果集中;

    ③ Oracle读取外部表中的第二行,然后和内部表中的数据逐一对比,所有匹配的结果放在结果集中;

    ④ 重复上面的步骤,直到外部表中的所有记录全部处理完,最后产生满足条件的结果集。

    驱动表一般为根据where条件能得到的较小条件的结果表,而不一定是整个表记录比较小的小的表。

    指定oralce优化器按照嵌套循环连接连接两个表

    Select /*+ use_nl(a b)*/ a.* from a,b where a.col1=b.col1;

    2.2 SORT MERGE JOIN

    ① Oracle优化器判断第一个源表是否已经排序,如果已经排序自动跳入下一步,否则对第一个源表排序;

    ② Oracle优化器判断第二个源表是否已经排序,如果已经排序自动跳入下一步,否则对第二个源表排序;

    ③ 已经排过序的两个源表进行合并操作,并生成最后的结果集。

    通常情况下,散列连接的效果都比排序效果要好,然而如果行源已经被排过序,在执行排序连接时不需要再进行排序;或者where条件中是对两张表进行比较操作,那么排序合并连接优于散列连接。

    指定oralce优化器按照排序合并连接连接两个表

    Select /*+ use_merge(a b)*/ a.* from a,b where a.col1>b.col1;

    2.3 HASH JOIN

    当内存能够提供足够的空间时,HASH连接是优化器常做的选择,哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立基于这张表的基于连接键的HASH表;优化器再扫描连接表中的大表,将大表中的数据与哈希表中的数据进行比较,如果有相关联的数据,则将数据添加到结果集中。

    当表连接中小表能完全cash到可用的内存时,哈希连接的效果最佳。哈希连接的成本只是两个表从硬盘读入到内存的成本。

    如果哈希表过大不能完全cash到可用的内存时,优化器会把哈希表分成多个分区,再把这些分区逐一cash到内存中。当表的分区超过了可用内存时,分区的部分数据就会临时的写到磁盘的临时表空间上。

    当哈希表构建完成后,还需要进行后面的操作

    ① 第二个大表进行扫描,如果大表不能完全cash到可用内存时,大表同样会被分为很多分区;

    ② 大表的第一个分区cash到内存,对大表的第一个分区数据进行扫描,并与哈希表的数据进行比较,如果有匹配的记录,添加到结果集里面;其他分区也做类似处理;

    ③ 当所有分区处理完成后,Oracle对产生的结果集进行汇总,归并,产生最终的结果。

    这种连接方式适用于较小的表可以cash到内存的情况,

    指定oralce优化器按照哈希连接连接两个表

    Select /*+ use_hash(a b)*/ a.* from a,b where a.col1=b.col1;

    2.4 CARTESTION JOIN

    如果where条件中没有写出两张表的连接条件,优化器会把第一张表的每一条记录和第二章表的所有记录连接,生成结果集。很少用到。

  • 相关阅读:
    大数据概述
    递归下降语法分析
    消除左递归c语言文法
    自动转换机
    简单的C语言文法
    实验报告一 词法分析程序
    组合数据类型练习
    Python绘制五星红旗
    熟悉常用Linux操作
    大数据概述
  • 原文地址:https://www.cnblogs.com/wangrui1587165/p/9444339.html
Copyright © 2011-2022 走看看