消除数据重分布

AnalyticDB PostgreSQL属于MPP数据库,数据分布在各个segment节点, 分布方式为hash、random和replication。许多查询在执行中需要进行数据交换, 比如redistribution和broadcast。数据交换所导致的费用在整个查询执行时间中所占比例比较可观,同时也消耗网络资源。所以应该尽量减少和避免数据交换。

首先分析数据库系统的查询模式,确定系统中成本最高的查询,并根据这些查询的需求进行初始数据库设计。决定查询总成本的因素包括查询运行需要多长时间以及它消耗多少计算资源。决定查询成本的其他因素是它的运行频率,以及它对其他查询和数据库操作的影响程度。 确定成本最高的查询使用的表,并评估它们在查询执行中的作用,考虑表是如何join和聚合的。

对于一个大表join多个小表的场景,类似star schema,采用大表(fact表)和最大的小表(dimension表)的共同列作为数据分布列。根据参与最常见join的数据集的大小选择最大dimension表,而不仅仅是表的大小。如果涉及到一个表的查询普遍带有WHERE语句,只有它的一部分行参与join。对于其它dimension表,根据它们和别的表join的情况,采用它们的主键或外键作为分区键。

如果一个dimension表不能通过上面的措施实现和fact表的collocated join, 考虑采用replication的分布方式。

如果一个表在很大程度上是非规范化的并且不参与连接,可以采用random分布方式。