对一个读操作来说应该读取离它最近的数据块副本。如果在读节
点的同一个机架上就有这个复制,就直接读这个,如果物理集群是跨
越多个数据中心,那么本地数据中心的复制是优先于远程的复制。
2.2、实时多表关联查询技术;
高性能的关联查询需要根据不同的模式采用不同关联算法,在基于代价的优化方式下,
一般采用 hash join 算法,它是一种用于 equi-join(而 anti-join 就是使用 NOT IN 时的 join)
的技术。
Hash join 的主要资源消耗在于 CPU(在内存中创建临时的 hash 表,并进行 hash 计算)。
在绝大多数情况下,hash join 效率比其他 join 方式效率更高:在 Sort-Merge Join(SMJ),两张
表的数据都需要先做排序,然后做 merge。因此效率相对最差;Nested-Loop Join(NL)效率比
SMJ 更高。特别是当驱动表的数据量很大(集的势高)时。这样可以并行扫描内表。Hash join
效率最高,因为只要对两张表扫描一次。
Hash join 一般用于一张小表和一张大表进行 join 时。Hash join 的过程大致如下(在并
行情况下):
(1) 一张小表被 hash 在内存中。因为数据量小,所以这张小表的大多数数据已经驻
入在内存中,剩下的少量数据被放置在临时表空间中;
(2)每读取一条大表的记录,和内存中小表的数据比较,如果符合先做 join,而不直
接输出,直到整张大表数据读取完毕。如果内存足够,Join 好的数据就保存在内存中。否则,
就保存在临时表空间中。
(3)当大表的所有数据都读取完毕,将临时表空间中的数据以其输出。如果小表的数
据量足够小,那所有数据就都在内存中了,可以避免对临时表空间的读写。
基于规则的优化方式下,经常采用 Sort-Merge Join(SMJ)连接和 Nested-Loop Join(NL)连接。
Nested Loop Join(嵌套循环联结) 对于主表的每条记录 将其与从表的每条记录 在 JOIN
条件的字段上直接比较并筛选出符合条件的元组。被联结的表所处内层或外层的顺序对磁盘
I/O 开销有着非常重要的影响,而 CPU 开销相对来说影响较小。
Nested Loop 一般在两个集合都很大的情况下效率就相当差了,而 Sort-Merge 在这种情
况下就比它要高效不少,尤其是当两个集合的 JOIN 字段上都有聚集索引(clustered index)存
在时,Sort-Merge 性能将达到最好。
基本算法主要有两个步骤:
(1)按 JOIN 字段进行排序
(2)对两组已排序集合进行合并排序,从来源端各自取得数据列后加以比较(需要根据
是否在 JOIN 字段有重复值做特殊的“分区”处理)
有两个因素左右 Sort-Merge 的开销:JOIN 字段是否已排序 以及 JOIN 字段上的重复值
有多少。
• 最好情况下(两列都已排序且至少有一列没有重复值):O (n + m) 只需要对两个
集合各扫描一遍。
• 最差情况下(两列都未排序且两列上的所有值都相同):O (n * log n + m * log m + n