发布于: Aug 9, 2022

Amazon Redshift 云数据库的搭建会牵扯到表分配方式以及排序键的选择,尤其是分配方式的不可变性,要求我们必须慎之又慎,本文将会为您介绍两种设计的最佳实践方案。

前文中我们已经说明了数据分配的两个目标即均匀分配工作负载和减少数据移动,在 Amazon Redshift 中创建表后,无法更改其分配方式。要使用其他分配方式,您需要重新创建新表并借助深层复制填充该新表,所以我们需要在初期设计中充分考虑我们当前的需求和未来的增长的趋势。下面是一些分配方式的最佳实践:

  • 如果表大部分为非规范化数据且不参与联接,或如果您无法明确确定采用其他分配方式,请使用 EVEN 分配。
  • 当事实表和一个维度表频繁 join 时,选择联接键作为事实表和维度表的 KEY 分配键,从而实现两者并置,但是要注意,事实表只能有一个分配键。任何通过其他键联接的维度表都不能与此事实表并置。所以,我们要根据联接频率和联接行的大小妥善选择一个要并置的维度。另外,请注意 KEY 分配时,可能导致数据分配不均匀。
  • 我们要根据常用查询筛选后的数据集的大小决定谁是最大的维度。而不是单纯看整个表的大小。
  • 将一些维度表使用 ALL 分配。如果一个维度表不能与事实表或其他重要的联接表并置,您可以通过将整个表分配到所有节点的方法来大大提高查询性能。不过需要注意的是使用 ALL 分配可能会使存储空间需求成倍增长,并且会增加加载时间和维护操作,所以在选择 ALL 分配前应权衡所有因素。
  • 选择高基数的列筛选结果集,所谓高基数列是指不同列值多的列。假设您将一个销售表的日期列作为分配键,除非您的大多数销售都是季节性的,否则数据分配会非常均匀。但是,如果您的查询通常使用范围受限谓词进行筛选并缩小日期期间的范围,则大多数筛选出来的行很可能都将出现在有限的一组切片上并且查询工作负载将偏斜。这也可能对性能造成不利影响。
  • Amazon Redshift 不强制实施主键和外键约束,但查询优化程序在生成查询计划时会使用它们。如果您在表上设置了主键和外键,则您的应用程序必须维护这些键的有效性。

复合排序键与交错排序键区别

  • 复合排序键可以加快联接、GROUP BY 和 ORDER BY 操作,以及使用 PARTITION BY 和 ORDER BY 的窗口函数。例如,当数据在联接列上分配和预先排序时,可以使用合并联接(通常快于哈希联接)。此外,复合排序键还有助于提高压缩率。
  • 为了便于理解,我们假设有一个表以 cust_id 和 prod_id 做排序键,其中 cust_id 作为主列而 prod_id 作为辅助排序列,每四条记录填充一个数据块,如图 2 所示。那么当我们查询 cust_id=1 的记录时,我们只需要扫描一个数据块,而当查询 prod_id=1 的记录时,我们需要扫描四个数据块。

图 1

  • 交错排序为排序键中的每个列或列的子集赋予相同的权重。我们用同一个例子来说明,依然是 cust_id 和 prod_id 作为排序键,但这次是交错排序,如图 3 所示。那么当我们查询 cust_id=1 或者 prod_id=1 的记录时,我们都要访问两个数据块。
  • 交错排序对于高选择性查询(即在 WHERE 子句中对一个或多个排序键列进行筛选的查询,如 select c_name from customer where c_region = ‘ASIA’)最为有效。交错排序的优势随着受限制排序列的数量增加而增大。
  • 交错排序对于大型表将更为有效。排序是针对每个切片应用的,因此,当某张表大到足以使每个切片占用多个 1 MB 数据块,从而使查询处理器能够借助限制性谓词跳过大量的数据块时,交错排序最为有效。要查看表使用的数据块数,请查询 STV_BLOCKLIST 系统视图。
  • 对单一列排序时,如果该列的值拥有较长的共同前缀,则交错排序的性能要优于复合排序。如都以“http://www”打头的 URL。复合排序键使用前缀中有限数量的字符,因此会产生大量的重复键。交错排序为区域映射值使用了内部压缩方案,使它们能够更好地区分具有较长共同前缀的列值。
  • 请勿在具有单调递增属性的列 (例如,身份列、日期或时间戳) 上使用交错排序键。
  • 当您考虑交错排序键时,需要在可能获得的性能提升与增加的负载以及 vacuum 次数之间进行权衡。

图 2

REINDEX

  • 在您向已包含数据且已排序的表中不断添加行的过程中,性能会逐渐下降。复合排序和交错排序都会出现这种性能下降,但交错排序的表受到的影响更大。
  • VACUUM 可恢复排序顺序,但对于交错排序的表,该操作可能需要花费更长的时间,因为合并新的交错数据可能涉及到修改每一个数据块。
  • 如果偏斜过大,则性能会受到影响。要重新分析排序键并恢复性能,请运行包含 REINDEX 关键字的 VACUUM 命令。对于交错排序的表,由于它需要对数据进行额外的分析,因此,VACUUM REINDEX 需要花费比标准 VACUUM 操作还要长的时间。
  • 要查看有关键分配偏斜和上次重建索引时间的信息,请查询SVV_INTERLEAVED_COLUMNS 系统视图。
相关文章