Content #
大小表关联时,可以把小表复制到相关存储节点,这样全局关联就被转换为一系列的本地关联,再汇总起来就得到了最终结果。这种算法的具体实现方式有两种。
静态方式 #
在创建表的时候,直接使用关键字将表声明为复制表,这样每个节点上都会保留一份数据副本。当它与大表关联时,计算节点就可以将关联操作下推到每个存储节点进行。很多分布式数据库,比如 TBase、TDSQL 等,都支持定义复制表。
动态方式 #
动态方式也称为“小表广播”,这种方式不需要人工预先定义,而是在关联发生时,系统自行处理。这就是说,当关联的某张表足够小时,在整个集群中分发不会带来太大的网络开销,系统就将其即时地复制到相关的数据节点上,实现本地关联。
下面这张图体现了小表广播的过程。
动态方式和并行执行引擎有直接的联系,例如 Spark 并行执行引擎中的 Broadcast Hash Join 就是先采用动态广播方式,而后在每个节点上再执行哈希连接。
当然,这里的 “复制”和“广播”只表达了自然语义,不能作为静态还是动态的判断标准。比如,TDSQL 中的“广播表”,TBase 中的“复制表”,说的都是指静态方式。