2.14 ER 拆分

2.14.1 普通ER拆分

当我们需要两个表要进行join的时候,由于数据被分配到不同的节点上,普通的nest loop 方式可能效率会很低。
如果我们能把需要join的表按照统一规则划分到相同的区上,就能大概率的解决这一问题。
举个简单的例子如下:
14_er_table

这样两张表具有外键关系,我们可以仿照聚簇的方式按照对应列来进行拆分,这样就可以不跨库实现join了。
如下图:
14_er_table_split

要实现这样的ER功能,需要如下配置。

<shardingTable name="sales" shardingNode="dn1,dn2" function="sharding" shardingColumn="id">
<childTable name="sales_detail" joinColumn="sales_detail_pos_num" parentColumn="sales_pos_num"/>
</table>

2.14.2 智能的ER关系

当我们有多个不同的表时,上面的配置方式有点难以使用了。
这种情况下,如果2张或者多张表在dble上的分片规则相同并且具体分片也相同,即使没有配置ER关系,也会当作ER关系来处理。
举例如下配置(片段):

<!--schema片段-->
<shardingTable name="tableA" shardingNode="dn1,dn2" function="hash_function" shardingColumn="id_a" />
<shardingTable name="tableB" shardingNode="dn1,dn2" function="hash_function" shardingColumn="id_b" />
<shardingTable name="tableC" shardingNode="dn2,dn1" function="hash_function" shardingColumn="id_c" />
<shardingTable name="tableD" shardingNode="dn3,dn4" function="hash_function" shardingColumn="id_a" />
<shardingTable name="tableE" shardingNode="dn1,dn2" function="hash_function" shardingColumn="id_a" />
<shardingTable name="tableF" shardingNode="dn1,dn2" function="enum_par" shardingColumn="id_a" />

<!--rfunction片段-->
<function name="enum_par"
   class="com.actiontech.dble.route.function.PartitionByFileMap">
   <property name="mapFile">partition-hash-int.txt</property>
</function>
<function name="hash_function" class="com.actiontech.dble.route.function.PartitionByLong">
   <property name="partitionCount">2</property>
   <property name="partitionLength">512</property>
</function>

最终会得出这样一个映射关系,识别分组会根据数据分布结点 和function的唯一性将表分为几组,同一组的才会有ER关系。

table名 拆分列 数据分布结点 function 识别分组
tableA id_a dn1,dn2 hash_function 1
tableB id_b dn1,dn2 hash_function 1
tableC id_c dn2,dn1 hash_function 2
tableD id_a dn3,dn4 hash_function 3
tableE id_a dn1,dn2 hash_function 1
tableF id_a dn1,dn2 enum_par 4

即,ER关系集合为:

<tableA.id_a , tableB.id_b, tableE.id_a > 

<tableC.id_c>

<tableD.id_a>

<tableF.id_a>

PS:此处略去了schema,实际实现需要标识schema防止重复,ER关系是到列的,如果关联关系不是上述表对应的列,也不会视为ER.

results matching ""

    No results matching ""