分布式关联是指在不同节点或服务器上存储的数据表之间的关联操作。这种关联操作涉及到跨多个物理位置的数据处理,需要在逻辑上保持数据的一致性和完整性,同时确保查询的高效执行。分布式关联的实现依赖于分布式数据库管理系统(DDBMS)的功能,该系统能够协调和管理分布在多个地点的数据,使得用户或应用程序可以像操作单一数据库一样操作分布式数据库。
如,TBL_A、TBL_B两表关联,其中TBL_A和TBL_B都有f1,f2两列,其两表分布式关联分为如下三种场景。
场景一:两表关联,关联条件与两张表的分布键相同,都是f1
select * from TBL_A join TBL_B on TBL_A.f1 = TBL_B.f1;
由于两张表的数据分布算法一致,相同f1的数据位于同一个DN节点中,那么只需要在每个DN节点内完成关联,将结果返回CN汇总即可,SQL可以下推DN执行。
场景二:TBL_B关联字段没有用到分布键,TBL_B很小
select * from TBL_A join TBL_B on TBL_A.f1 = TBL_B.f2;
两张表的数据分布算法一致,相同f1的数据位于同一个DN节点中,由于TBL_B的关联字段为f2,TBL_A关联需要的TBL_B数据,和TBL_B数据在DN上的分布情况不一致,不能下推到DN执行。
解决方案:
将TBL_B定义为复制表(在每个DN都有一个完整的副本)。此时,每个DN上都有TBL_A关联TBL_B所需要的数据,关联可以在每个DN节点内完成,SQL就可以下推DN执行。
场景三:TBL_B关联字段没有用到分布键,TBL_B很大
select * from TBL_A join TBL_B on TBL_A.f1 = TBL_B.f2;
此时TBL_B不满足定义为复制表的条件,SQL无法下推DN执行。
解决方案:
在CN上生成一个全局的执行计划,将SQL拆分成几个动作,分别在所有DN节点上执行,而TBL_B则需要在所有DN节点上查询到需要的数据,并按f2在DN之间重新交换数据后,才能与TBL_A进行关联,然后再汇总到CN节点。