发布于: Oct 10, 2022
Amazon Redshift 是为 OLAP 场景云原生设计的企业级数据仓库,许多行业领先的第三方工具(BI 商业智能、报表及可视化数据分析工具)已经与 Amazon Redshift 深度集成,可以对 Amazon Redshift 的数据进行加载、转换和可视化。Amazon Redshift 通过大规模并行处理(MPP)、列式数据存储和高效且具有针对性的数据压缩等特性的组合,实现了高效存储和优异的查询性能,因此一经推出就受到广大用户的好评。
Amazon Redshift 的表设计与 OLTP 的表设计有很大区别,Amazon Redshift 需要面对海量数据集和极其复杂的分析查询,如果设计不当,大规模并行处理就会受到数据分配不均和数据移动的影响,从而大大影响性能,本文希望能为读者理清 Amazon Redshift 表设计的一些基本原则,分享一些最佳实践,让读者能最大限度地发挥 Amazon Redshift 的潜力。阅读本文需要一定的基础数据库知识。
1.1、表设计要素
首先,我们需要了解一些 Amazon Redshift 的基本概念和表设计的要素。
1.1.1 节点和切片
Amazon Redshift 集群由节点组成。每个集群包括一个领导节点以及一个或多个计算节点。
- 领导节点接收来自客户端应用程序的查询、解析查询并制定查询执行计划。然后,领导节点和计算节点协调这些计划并行执行,之后,领导节点聚合来自计算节点的中间结果。最后,领导节点会将这些结果最终返回至客户端应用程序。
- 计算节点执行查询执行计划,并在节点自身之间传输数据完成查询。中间结果被送回至客户端应用程序之前,会先发送至领导节点进行聚合。
- 一个计算节点分为多个切片。将为每个切片分配节点的内存和磁盘空间的一部分,从而处理分配给节点的工作负载的一部分。每个节点的切片数取决于集群的节点大小。例如,每个 xlarge 计算节点有两个切片,每个 ds2.8xlarge 计算节点有 16 个切片。所有节点均参与并行查询执行,查询处理应尽可能跨切片均匀分配的数据。
1.1.2 分配方式
将数据加载到表中时,Amazon Redshift 根据表的分配方式将表中的行分配到各个计算节点。在运行查询时,查询优化程序根据执行任何联接和聚合的需要将行重新分配到计算节点。Amazon Redshift 中表有以下4种分配方式。
EVEN 分配
不管任意特定列中的值是什么,领导节点都以轮询方式向所有切片分配行。当表不参与联接或无法明确地在 KEY 分配和 ALL 分配之间做出选择时,即可使用 EVEN 分配。
KEY 分配
根据一列中的值分配行。领导节点会将匹配的值放置到同一个节点切片上。如果基于两个表的联接键来分配这对表,领导节点会根据联接列中的值在切片上并置行,使共同列相匹配的值实际存储在一起。
ALL 分配
每个节点都会分配一份整个表的副本。而相对的,EVEN 分配或 KEY 分配只将表中的部分行放置在每个节点上。
AUTO分配
如果您未指定带 CREATE TABLE 语句的分配方式,Amazon Redshift 将应用AUTO 分配。利用 AUTO 分配,Amazon Redshift 可基于表数据大小分配最佳分配方式。例如,Amazon Redshift 最初向小型表分配的是 ALL 分配,然后在表变大时更改为 EVEN 分配。当表从 ALL 分配更改为 EVEN 分配时,存储利用率可能略有变化。几秒钟后,分配更改将在后台进行。Amazon Redshift 绝不会将分配方式从 EVEN 更改为 ALL。
1.1.3 排序键
在创建表时,您可以将其中一个或多个列定义为排序键。初次向空表中加载数据时,行以排序顺序存储在磁盘上。有关排序键的信息会被传递给查询计划程序,后者借助该信息构建出能够充分利用数据排序方式的计划。
复合排序键(Compound Sort Key)
复合键由排序键定义中列出的所有列组成(顺序即为其排列顺序)。当查询的筛选条件应用了使用排序键前缀的条件(如筛选条件和联接)时,复合排序键最为有用。当查询只依赖于辅助排序列而不引用主列时,复合排序的性能优势会下降。COMPOUND 是默认的排序类型。
交错排序键(Interleaved Sort Key)
交错排序为排序键中的每个列或列的子集赋予相同的权重。如果多个查询使用不同的列作为筛选条件,则通常可以使用交错排序方式来提高这些查询的性能。譬如当查询对辅助排序列使用限制性谓词时,与复合排序相比,交错排序可显著提高查询的性能。
1.2、设计目标
了解了以上一些基础概念后,我们来了解 Amazon Redshift 表设计的主要目标。
1.2.1 数据分配目标
数据重新分配
将数据加载到表中时,Amazon Redshift 根据表的分配方式将表中的行分配到各个节点切片。作为查询计划的一部分,优化程序会确定需要将数据块放置在何处,以便最好地执行查询。然后,在执行期间,数据可能被实际移动或重新分配。重新分配可能涉及将特定的行发送到特定的节点以进行联接,或将整个表广播到所有节点。数据重新分配可能占到查询计划成本的一大部分,其产生的网络流量可能会影响其他数据库操作并降低整个系统的性能。所以我们调整表的数据分配有两个主要目标:
- 将工作负载均匀地分配到集群中的节点上。不均匀的分配或数据分配偏斜会导致某些节点执行的工作比其他节点多,从而影响查询性能。
- 尽量减少查询执行期间的数据移动。如果参与联接或聚合的行已在节点上与其在其他表中将要联接的行并置,则优化程序在查询执行期间不必重新分配过多的数据。
您为表选择的分配策略会对查询性能、存储需求、数据加载和维护产生重大影响。通过为每张表设计最佳的分配方式,您可以均衡数据分配并显著提高整个系统的性能。
1.2.2 排序键目标
排序可实现范围限制谓词的高效处理。Amazon Redshift 将列式数据存储在 1 MB 大小的磁盘数据块中。每个数据块的最小值和最大值作为元数据的一部分存储。如果查询使用范围限制谓词,则查询处理器可在表扫描期间借助数据块的最小值和最大值来快速跳过大量的数据块。如图1所示,如果某张表存储着按日期排序的1年数据,且查询指定了一天的日期范围,则该查询可能跳过多达 99.7% 的磁盘数据块扫描操作。如果数据未排序,则该查询就不得不扫描更多(也可能是全部)的磁盘数据块。
图1