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 - 表链接的几种方式:函数
链接说明:学习
举例:优化
注:这里将首先存取的表称做 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 中的位置,在该位置上检查可否找到匹配的数据。
还想进一步加深学习的同窗能够点击下列连接,写的算比较详细的了。