Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

选择排序键

在创建表时,您可以将其一个或多个列定义为排序键。初次向空表中加载数据时,行以排序顺序存储在磁盘上。有关排序键列的信息会被传递给查询计划程序,后者借助该信息构建能够充分利用数据排序方式的计划。

排序可实现范围限制谓词的高效处理。Amazon Redshift 将列式数据存储在 1 MB 的磁盘数据块中。每个数据块的最小值和最大值作为元数据的一部分存储。如果查询使用范围限制谓词,则查询处理器可在表扫描期间借助该最小值和最大值快速跳过大量的数据块。例如,如果某张表存储着按日期排序的五年数据,且查询指定了一个月的日期范围,则该查询可消除多达 98% 的磁盘数据块扫描操作。如果数据未排序,则该查询就不得不扫描更多(也可能是全部)的磁盘数据块。

您可以指定复合排序键或交错排序键。当查询谓词使用了前缀(有序排序键列的子集)时,复合排序键的效率更高。交错排序键为排序键中的每个列赋予相同的权重,因此,查询谓词可以使用构成该排序键的列的任意子集(可以是任意顺序)。有关使用复合排序键和交错排序键的示例,请参阅比较排序方式

要了解排序键的选择对查询性能产生的影响,请使用 EXPLAIN 命令。有关更多信息,请参阅 查询计划和执行工作流程

要定义排序类型,请在您的 CREATE TABLE 或 CREATE TABLE AS 语句中使用 INTERLEAVED 或 COMPOUND 关键字。默认为 COMPOUND。INTERLEAVED 排序键可使用多达八个列。

要查看某张表的排序键,请查询 SVV_TABLE_INFO 系统视图。

复合排序键

复合键由排序键定义中列出的所有列组成(顺序即为其排列顺序)。当查询的筛选条件应用了使用排序键前缀的条件(如筛选条件和联接)时,复合排序键最为有用。当查询只依赖于辅助排序列而不引用主列时,复合排序的性能优势会下降。COMPOUND 是默认的排序类型。

复合排序键可以加快联接、GROUP BY 和 ORDER BY 操作,以及使用 PARTITION BY 和 ORDER BY 的窗口函数。例如,当数据在联接列上分配和预先排序时,可以使用合并联接(通常快于哈希联接)。此外,复合排序键还有助于提高压缩率。

在您向已包含数据的排序表中添加行的同时,未排序区域也随之增长,这会对性能产生显著的影响。当表使用交错排序时,特别是当排序列包含单调递增数据(如日期或时间戳列)时,这种影响会更大。您应定期运行 VACUUM 操作,特别是在加载大量数据后,以重新排序和重新分析数据。有关更多信息,请参阅 管理未排序区域的大小。在执行 vacuum 操作以重新排序数据后,最好运行 ANALYZE 命令以更新查询计划程序的统计元数据。有关更多信息,请参阅 分析表

交错排序键

交错排序为排序键中的每个列或列的子集赋予相同的权重。如果多个查询使用不同的列作为筛选条件,则通常可以使用交错排序方式来提高这些查询的性能。当查询对辅助排序列使用限制性谓词时,与复合排序相比,交错排序可显著提高查询的性能。

重要

请勿在具有单调递增属性的列 (例如,身份列、日期或时间戳) 上使用交错排序键。

您应将实施交错排序键获得的性能提升与增加的负载和 vacuum 次数进行权衡。

交错排序对于高选择性查询(在 WHERE 子句中对一个或多个排序键列进行筛选的查询,如 select c_name from customer where c_region = 'ASIA')最为有效。交错排序的优势随着受限制排序列数量的增加而增大。

交错排序对于大型表更为有效。排序是针对每个切片应用的,因此,当某张表大到足以使每个切片占用多个 1 MB 数据块,从而使查询处理器能够借助限制性谓词跳过大量的数据块时,交错排序最为有效。要查看表使用的数据块数,请查询 STV_BLOCKLIST 系统视图。

对单一列进行排序时,如果该列的值拥有较长的共同前缀,则交错排序的性能要优于复合排序。如都以“http://www”打头的 URL。复合排序键使用前缀中有限数量的字符,因此会产生大量的重复键。交错排序为区域映射值使用了内部压缩方案,使它们能够更好地区分具有较长共同前缀的列值。

VACUUM REINDEX

在您向已包含数据的排序表中不断添加行的过程中,性能会逐渐下降。复合排序和交错排序都会出现这种性能下降,但交错表受到的影响更大。VACUUM 可恢复排序顺序,但对于交错表,该操作可能需要花费更长的时间,因为合并新的交错数据可能涉及到修改每一个数据块。

初次加载表时,Amazon Redshift 会分析值在排序键列中的分配,并利用该信息来优化排序键列的交错操作。随着表的增大,排序键列中值的分配可能会发生变化或偏斜,日期或时间戳列的变化或偏斜更加明显。如果偏斜过大,则性能会受到影响。要重新分析排序键并恢复性能,请运行包含 REINDEX 关键字的 VACUUM 命令。对于交错表,由于它需要对数据进行额外的分析,因此,VACUUM REINDEX 需要花费比标准 VACUUM 操作还要长的时间。要查看有关键分配偏斜和上次重建索引时间的信息,请查询 SVV_INTERLEAVED_COLUMNS 系统视图。

有关如何确定运行 VACUUM 的频度和运行 VACUUM REINDEX 的时机的更多信息,请参阅决定是否重建索引