【性能优化】9.3 [集群] 复写维表

 

【性能优化】9.2 [集群] 集群复组表

9.3 复写维表

我们来讨论外键关联,先看小维表的情况,也就是可以把维表装入分机内存的情况。

那么,把维表装入哪个分机的内存呢?

在所有分机都装入一份。

集群下的事实表很大,会存储在各个分机上,而维表记录将被随机访问,任何一个分机上的事实表都可能关联全部维表记录,如果装维表固定存储在某个分机上,这又会带来大量的网络传输量。在维表较小的时候,可以让每个分机上都加载一份维表,这样关联运算又变成本机运算了。

这种被复制了多份的维表称为复写维表

小维表不大,不必分区存储,在外存中也可以复制存储到所有分机中,然后在每台分机上加载。


A

B

1

["192.168.0.101:8281","192.168.0.102:8281",…, "192.168.0.104:8281"]

2

fork to(4);A1

=file("product.ctx").open().import()

3


>env(PRODUCT,B2)

4

=memory(A1,PRODUCT)

5

=file("orders.ctx":to(4),A1).open().cursor(p_id,quantity)

6

=A5.switch(p_id,A4)

7

=A7.groups(p_id.vendor;sum(p_id.price*quantity))

先使用 fork 框架在每个分机上加载维表,并命名为某个全程变量。回到主机用 memory 函数基于各分机的全程变量创建一个复写维表。后续针对集群表的运算和单机基本相同,复写维表对于某个分机而言就是本机内存中的序表,可以像单机维表一样用在 switch 以及 join 等函数中实现地址化。SPL 处理每个分机运算时将在本机寻找到这份维表进行关联。

维表常常在多个运算任务中复用,fork 代码块可以在分机启动时执行,主机程序只要从建立复写维表开始。较小的多层维表也可以事先在分机中做好预关联。

区分维表和事实表,利用维表较小的特征,事先加载到每个分机。这种外键关联也不会产生网络传输。

数据库不区分维表和事实表,一般会根据表的大小决定是否复制到分机。在两表关联时,优化得较好的数据库和上述方案差别不大,但表较多或关联层次较复杂时就可能“犯晕”。有些优化不太好的分布式数据库会对所有表都采用分区存储,关联性能就会较差。

【性能优化】9.4 [集群] 分段维表

【性能优化】 前言及目录