学习doris过程中看到一篇博客https://blog.bcmeng.com/post/doris-colocate-join.html,里面提到了很多种join。
首先,根据sql语法有这些:
inner join、full outer join、left join、left semi join、anti join。
常见join算法有这几种:
nested loop join:嵌套循环连接,就是用双层for循环。时间复杂度O(A*B)。
hash join:小表join大表时,扫描小表,根据join key把小表存hashtable中,再扫描大表去hashtable里面找,大体思路是这样。两张表都只扫描一次,时间复杂度O(A+B)。
sort merge join:两张表分别排序,排好了之后用merge。
分布式系统实现join的策略:
shuffle join:两张表根据join key分发到各个节点,然后在各个节点join。有shuffle。比如mapreduce/hive的常规的join。
broadcast join:小表广播到大表所在节点。比如hive的mapjoin和sparksql的broadcast hashjoin。没有shuffle(两张表的数据在节点间分发、传输)。
Colocate/Local Join:就是指多个节点 Join 时没有数据移动和网络传输,每个节点只在本地进行 Join,能够本地进行 Join 的前提是相同 Join Key 的数据分布在相同的节点。<