1、Nested loop
1、选取量表中过滤后行数最少的表
2、小表中选取一行
3、使用小表中的列的值到大表中匹配数据
4、大表中从头到尾匹配完毕后继续读小表
小表读一遍,大表读(小表行数遍)
适用于小表和大表的连接,小表是指绝对小表(行数少)
要求大表的关联列一定有索引
2、sort merge
适用于预先排好序的数据的关联(数据是完全从索引中得到的,并且索引的首列是关联列)
sort join:将排好序的结果放到PGA中
merge join:用a表的10去从上往下匹配排好序的b表,当b表的10匹配完了就停下,再用a表的20去匹配b表刚才停下来的位置。
将表排好序放到PGA中,从buffer cache中只读取了一次,很少出现栓所征用的问题。
小表读一遍,大表读一遍。
缺点:
如果表特别大,PGA不够,会将磁盘当内存用
排序是超级消耗CPU的操作,PGA也会满,临时文件也会满
3、HASH JOIN
特别适用于大表和大表的关联,也是Oracle默认的关联算法。
缺点:hash join仅适用于等式连接