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

 

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

9.4 分段维表

维表需要被随机访问,而外存不具备这样的能力,所以我们尽量要把维表装入内存。如果维表大到一台分机的内存装不下时,我们就试图在多个分机的内存中加载它。

较大的维表在外存中也会使用复组表存储,加载到分机中也是分区的,每个分机加载一个分区,多个分机内存中的分区共同构成一个完整的维表,称为分段维表


A

1

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

2

=file("product.ctx":to(4),A1).open().memory()

3

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

4

=A3.join(p_id,A2,vendor,price)

5

=A4.groups(vendor;sum(price*quantity))

A2 创建集群表后加载成分段维表,在 A4 中可以使用它与集群表做关联。

和复写维表不同,分段维表的数据是存在各个分机上的,没有一个分机上有全量的维表。这时候不能使用地址化的机制把事实表的外键转换成维表记录,因为某分机上某条事实表记录关联的维表记录可能在另一个分机,无法使用跨机的地址。这里就只能使用 join 函数取出要引用的维表记录字段再进行后续的计算。

为了能迅速定位关联的维表记录在哪个分机上,还会利用复组表的分区表达式。在关联维表时,主机会用事实表的外键计算分区表达式,获得该外键关联的维表记录会在哪个分机。作为维表的复组表,其分区表达式必须用主键来计算(维表的主键对应着事实表的外键)。

网络传输和硬盘读取有类似之处,都有个较复杂的准备动作,也不适合频繁小量访问。使用针对游标的 join 函数时,SPL 可以一次性读出一大批外键,分别传输到合适的分机上查询,而不会每次处理一个外键。SPL 没有提供针对单个外键获取分段维表记录的方法。

再强调一下,和同维关联及主子关联的情况不同,分段维表和关联的事实表可能使用同样的分区号,但仅仅是拆分方法,并不表示相同分区号的数据会关联。

用分段维表做关联时,运算过程中将会产生网络传输,不过传输内容并不算很大,只涉及事实表的外键和维表关联记录的字段,事实表其它字段不需要传输,计算直接完成,过程中也不会产生缓存数据。分布式数据库做连接运算时要传输关联结果集中涉及的两个表的所有字段,而且要缓存这些传输过来的数据才能在每个分机上进行后续的单机连接运算,还可能出现哈希算法无法避免的“运气不好”,导致不同分机上计算量非常不平衡,严重影响整体运算效率。总体来讲,分段维表会比数据库的哈希连接方法更有优势。

更大的维表,即多个分机也无法装载的情况,就要使用外存方案了。将事实表分布到集群中,维表仍然复制到每个分机,在分机上针对每个事实表分区执行单边分堆算法。这样又回到分机之间无依赖的情形,使用之前的框架就可以解决。

【性能优化】9.5 [集群] 冗余式容错
【性能优化】 前言及目录