【性能优化】9.3 [集群] 复写维表
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 代码块可以在分机启动时执行,主机程序只要从建立复写维表开始。较小的多层维表也可以事先在分机中做好预关联。
区分维表和事实表,利用维表较小的特征,事先加载到每个分机。这种外键关联也不会产生网络传输。
数据库不区分维表和事实表,一般会根据表的大小决定是否复制到分机。在两表关联时,优化得较好的数据库和上述方案差别不大,但表较多或关联层次较复杂时就可能“犯晕”。有些优化不太好的分布式数据库会对所有表都采用分区存储,关联性能就会较差。