多表连接从连接解释来说一般可以分为:NEXT LOOP、SORT MERGE、HASH JOIN。
NEST LOOP:
驱动表Driving Table,被驱动表Driven Table。驱动表做一次遍历,被驱动表做多次遍历。不需要排序。可以使用非等值连接。
SORT MERGE:
每个表都要先排序,然后进行合并。排序首先在内存中进行,能在内存中完成的叫做Optimal Sort(In-Memory Sort)。如果需要借助磁盘缓冲,叫做外部排序External Sort。
HASH JOIN:
一个驱动表,一个被驱动表。准备阶段:对驱动表的连接字段进行哈希操作,产生一系列的Hash Bucket(哈希桶);探测阶段:依次上去被驱动表每条记录,对连接字段执行相同哈希函数,和驱动表哈希桶进行匹配,这个过程叫探测(Probe)。
从语句连接方式来说一般可以分为:传统连接(Inner Join、Left/Right Outer Join、Full Join、Cross Join),半连接(包括Left/Right Semi Join、Left/Right Anti Semi Join;In、Exists是Semi-Join,Not Exists、Not In是Anti-Join),非等值连接(Theta Join)。例子:
--left-semi-join
select L1 fromL where (L.1 ,L.2) in (select R.3,R.5 from R )
select L1 fromL where exists select 1 from R where L.1=R.3 and L.2=R.5)
--left-anti-semi-join
where(left.col1, left.col2) not in (R#3,R#5)