Oracle-表链接类型和表链接方式

表链接类型:

Oracle - 表链接的几种类型:html

  • 内链接(天然链接)
  • 外链接 web

    • 左外链接 (左边的表不加限制)
    • 右外链接(右边的表不加限制)
    • 全外链接(左右两表都不加限制)
  • 自链接(同一张表内的链接)

SQL的标准语法:sql

select table1.column,table2.column
from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2;

inner join 表示内链接;
left join表示左外链接;
right join表示右外链接;
full join表示彻底外链接;
on子句 用于指定链接条件。

注意:
1.若是使用from子句指定内、外链接,则必需要使用on子句指定链接条件;
2.若是使用(+)操做符指定外链接,则必须使用where子句指定链接条件。

示意图以下:svg

链接类型示意图


表链接方式:指执行计划里面的表链接方式

Oracle - 表链接的几种方式:函数

  • SORT MERGE JOIN(排序-合并链接)
  • NESTED LOOPS(嵌套循环)
  • HASH JOIN(哈希链接)
  • CARTESIAN PRODUCT(笛卡尔积)

链接说明:学习

  1. Oracle一次只能链接两个表。无论查询中有多少个表,Oracle 在链接中一次仅能操做两张表。
  2. 当执行多个表的链接时,优化器从一个表开始,将它与另外一个表链接;而后将中间结果与下一个表链接,以此类推,直处处理完全部表为止。

举例:优化

注:这里将首先存取的表称做 row source 1,将以后参与链接的表称做 row source 2;ui

(1) SORT MERGE JOIN(排序-合并链接):spa

假设有查询:select a.name, b.name from table_A a join table_B b on (a.id = b.id)code

内部链接过程:

a) 生成 row source 1 须要的数据,按照链接操做关联列(如示例中的a.id)对这些数据进行排序

b) 生成 row source 2 须要的数据,按照与 a) 中对应的链接操做关联列(b.id)对数据进行排序

c) 两边已排序的行放在一块儿执行合并操做(对两边的数据集进行扫描并判断是否链接)

延伸:

若是示例中的链接操做关联列 a.id,b.id 以前就已经被排过序了的话,链接速度即可大大提升,由于排序是很费时间和资源的操做,尤为对于有大量数据的表。

故能够考虑在 a.id,b.id 上创建索引让其能预先排好序。不过遗憾的是,因为返回的结果集中包括全部字段,因此一般的执行计划中,即便链接列存在索引,也不会进入到执行计划中,除非进行一些特定列处理(如仅仅只查询有索引的列等)。

排序-合并链接的表无驱动顺序,谁在前面均可以;

排序-合并链接适用的链接条件有: < <= = > >= ,不适用的链接条件有: <> like

(2) NESTED LOOPS(嵌套循环):

内部链接过程:

a) 取出 row source 1 的 row 1(第一行数据),遍历 row source 2 的全部行并检查是否有匹配的,取出匹配的行放入结果集中

b) 取出 row source 1 的 row 2(第二行数据),遍历 row source 2 的全部行并检查是否有匹配的,取出匹配的行放入结果集中

c) ……

若 row source 1 (即驱动表)中返回了 N 行数据,则 row source 2 也相应的会被全表遍历 N 次。

由于 row source 1 的每一行都会去匹配 row source 2 的全部行,因此当 row source 1 返回的行数尽量少而且能高效访问 row source 2(如创建适当的索引)时,效率较高。

延伸:

嵌套循环的表有驱动顺序,注意选择合适的驱动表。

嵌套循环链接有一个其余链接方式没有的好处是:能够先返回已经链接的行,而没必要等全部的链接操做处理完才返回数据,这样能够实现快速响应。

应尽量使用限制条件(Where过滤条件)使驱动表(row source 1)返回的行数尽量少,同时在匹配表(row source 2)的链接操做关联列上创建惟一索引(UNIQUE INDEX)或是选择性较好的非惟一索引,此时嵌套循环链接的执行效率会变得很高。若驱动表返回的行数较多,即便匹配表链接操做关联列上存在索引,链接效率也不会很高。

(3)HASH JOIN(哈希链接) :

哈希链接只适用于等值链接(即链接条件为 = )

HASH JOIN对两个表作链接时并不必定是都进行全表扫描,其并不限制表访问方式;

内部链接过程简述:

a) 取出 row source 1(驱动表,在HASH JOIN中又称为Build Table) 的数据集,而后将其构建成内存中的一个 Hash Table(Hash函数的Hash KEY就是链接操做关联列),建立Hash位图(bitmap)。

b) 取出 row source 2(匹配表)的数据集,对其中的每一条数据的链接操做关联列使用相同的Hash函数并找到对应的 a) 里的数据在 Hash Table 中的位置,在该位置上检查可否找到匹配的数据。


补充:

还想进一步加深学习的同窗能够点击下列连接,写的算比较详细的了。

  1. Oracle表三种链接方式(sql优化)

  2. 看懂Oracle执行计划