Data Distribution

为什么需要指定Data Distribution

当加载数据到Redshift表时,Redshift根据表的distribution类型,把数据导入到每个分片上。

当执行查询时会根据查询类型做数据的重新分布或拷贝,因为有些join查询需要其他表的所有数据,这样一来肯定带来额外的I/O和网络负载,影响到整体的系统性能。这是也data redistribution的目的:

  • 将每个节点的数据分布尽量均匀。如果分布不均匀,一些节点的负载就会比其他的要高,影响查询性能。
  • 为了减少查询过程中的数据传输。如果进行join查询或聚合查询时数据已经在节点上,就不需要进行redistribution的步骤。

四种方式

  • KEY。进行哈希分布,相同的值被分布到相同的slice。适合会进行join查询的列。
  • ALL。全表数据被分布到每个节点上。它带来的存储空间是原数据大小 x 节点数量, 而且在加载、更新、插入数据时会花更多的时间。它适合比较稳定(不会频繁更新)的表。对于小表,即使进行redistribute对IO性能也影响较小,所以小表没必要设置成DISTSTYLE ALL
  • EVEN。round robin,适合不会进行join操作的表。如果不知道是选KEY还是EVEN,则可以使用这种。
  • AUTO。Redshift自动选择数据分布方式

Key distribution

Key distribution时,两个表中列的相同值都会分布到同一个slice,例如product_shippingproduct_orders两张表都有order_number这一列,它们会在一起做join操作,则它们order_number中相同的值会分布到同一个slice:

image-20191128073812202

如果不用key distribution, 在join操作时需要跨slice进行复制,带来额外的IO成本:

image-20191128073828801

Even distribution

image-20191128073745582

总结

  1. Even: 数据按round robin分布到每个slice
  2. KEY:不同的表,某列上相同的值都会分布到同一个slice
  3. ALL:全表数据分布到每个节点的第一个slice上

image-20221109064856051