知识卡片

让数据分布方式提前匹配常见连接键,能在查询时省去一整轮数据重分布

普通读书笔记卡

内容

HAWQ的并行查询计划和串行查询计划最大的区别是多了Motion操作符——负责在不同节点间搬运和交换数据,具体分三种:Redistribution Motion按Hash键值重新分布数据、Broadcast Motion把数据广播到所有节点、Gather Motion把分散在各节点的数据收集到一起。一个具体的连接查询案例展示了数据预先分布方式对查询计划的直接影响:如果表lineitem按照l_orderkey做Hash分布、orders表按照o_orderkey做Hash分布,而这次查询恰好是按这两个连接键做连接(join),那么两张表在物理上已经天然地按连接键对齐分布了——同一个订单键对应的数据,在两张表里天然就落在同一个节点上,做连接操作时完全不需要经过任何数据重分布,直接在本地节点上就能完成连接、再做Gather Motion汇总结果即可;但如果换一种场景,需要连接的键和表原本的分布键不一致,查询计划里就必须多出一个Redistribution Motion节点,先把数据按连接键重新打散分布到各节点,才能真正开始做连接——这个额外的数据搬迁步骤在跨节点分布式系统里往往是相当昂贵的操作,会显著拖慢整体查询性能。这个案例给出了一条数据分布设计的重要经验:如果能提前预判到某些字段会是业务里最常用、最高频的连接键,在设计表的分布策略时就主动按这些字段做分布,可以让最常见的那批查询天然避开代价高昂的跨节点数据重分布这一步,直接在本地完成连接计算——这个思路的核心是”提前把数据按未来最可能被频繁使用的访问模式对齐好”,用一次性的、前置的分布设计投入,去换取后续大量查询运行时的性能收益,而不是让每次查询都被迫临时补上这道昂贵的重分布工序。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.5 解密Apache HAWQ——功能强大的SQL-on-Hadoop引擎"节,"6.5.2 Apache HAWQ系统架构"(源文件:_epub-src/OEBPS/Text/Chapter6_5_3.xhtml) - 结论依据:原文说明"左边的查询计划表示了如果表lineitem和orders都使用了连接键进行分布的情况……这样的话2个表做连接的时候是不需要进行重新分布的。右边的查询计划表示了一个需要重新分布数据的例子。该查询计划和左边的查询计划相比多了一个Motion节点",直接支撑本卡片结论。 - 原始内容:左边的查询计划表示了如果表lineitem和orders都使用了连接键进行分布的情况。在这个例子中,lineitem按照l_orderkey进行Hash分布,orders表按照o_orderkey进行分布。这样的话2个表做连接的时候是不需要进行重新分布的。