

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon Redshift 的查询性能因素
<a name="query-performance-factors"></a>

有很多因素会影响查询性能。数据、集群和数据库操作的以下方面都在查询处理速度方面发挥作用：
+ [表属性](#table-properties)
  + [排序键](#table-sort-keys)（Amazon Redshift Advisor）
  + [数据压缩](#data-compression)（自动）
  + [数据分布](#data-distribution)（自动）
  + [表维护](#table-maintenance)（自动）
+ [集群配置](#cluster-configuration)
  + [节点类型](#node-type)
  + [节点大小、节点数量和切片](#node-size)
  + [工作负载管理](#workload-management)（自动）
  + [短查询加速](#sqa)（自动）
+ [SQL 查询](#query)
  + [查询结构](#query-structure)
  + [代码编译](#code-compilation)

## 表属性
<a name="table-properties"></a>

Amazon Redshift 表是在 Amazon Redshift 中存储数据的基本单元，每个表都有一组决定其行为和可访问性的属性。这些属性包括排序、分发方式、压缩编码等。了解这些属性对于优化 Amazon Redshift 表的性能、安全性和成本效益至关重要。

### 排序键
<a name="table-sort-keys"></a>

Amazon Redshift 根据表的排序键将数据按照排序顺序存储在磁盘中。查询优化器和查询处理器使用有关数据在计算节点内位置的信息来减少必须扫描的数据块数。这样可以通过减少待处理的数据量显著提升查询速度。我们建议您使用排序键来简化 `WHERE` 子句中的筛选器。有关更多信息，请参阅 Amazon Redshift 文档中的[使用排序键](https://docs.aws.amazon.com/redshift/latest/dg/t_Sorting_data.html)。

### 数据压缩
<a name="data-compression"></a>

数据压缩降低了存储需求，从而减少了磁盘 I/O 并提高了查询性能。在运行查询时，压缩的数据将读入内存，然后在查询运行时解压缩。通过将少量数据加载到内存中，Amazon Redshift 可以分配更多内存来分析数据。由于列式存储将按顺序存储类似数据，因此 Amazon Redshift 能够应用与列式数据类型关联的自适应压缩编码。对表列启用数据压缩的最佳方式是使用 Amazon Redshift 中的 `AUTO` 选项，以在您将表与数据一起加载时应用最佳压缩编码。要了解有关使用自动数据压缩的更多信息，请参阅 Amazon Redshift 文档中的[使用自动压缩加载表](https://docs.aws.amazon.com/redshift/latest/dg/c_Loading_tables_auto_compress.html)。

### 数据分布
<a name="data-distribution"></a>

Amazon Redshift 根据表的分配方式在计算节点上存储数据。在执行查询时，查询优化程序根据执行联接和聚合的需要将数据重新分配到计算节点。为表选择正确的分配方式有助于通过在执行联接前将数据放在需要的位置来最大程度地减小重新分配步骤的影响。我们建议您使用分配键来简化最常见的联接。有关更多信息，请参阅 Amazon Redshift 文档中的[使用数据分配方式](https://docs.aws.amazon.com/redshift/latest/dg/t_Distributing_data.html)。

### 表维护
<a name="table-maintenance"></a>

尽管 Amazon Redshift 为大多数工作负载提供了开箱即用的行业领先性能，但要保持 Amazon Redshift 集群的良好运行仍需要维护。更新和删除数据会产生必须进行清理的无效行；如果追加顺序与排序键不一致，则即使是仅追加表也必须重新排序。

#### Vacuum
<a name="vacuum"></a>

Amazon Redshift 中的 vacuum 操作过程对于 Amazon Redshift 集群的正常运行和维护至关重要。它还会影响查询的性能。由于删除和更新都会标记旧数据，但实际上并未将其删除，因此您必须使用 vacuum 操作来回收被之前的 `UPDATE` 和 `DELETE` 操作标记为删除的表行所占用的磁盘空间。Amazon Redshift 可以在后台自动对表进行排序并执行 `VACUUM DELETE` 操作。

要在加载或一系列增量更新操作后清理表，您也可以对整个数据库或对单个表运行 `VACUUM` 命令。如果表具有排序键，并且表加载未优化为在其插入时进行排序，则必须使用 vacuum 对数据进行重新排序（这对性能至关重要）。有关更多信息，请参阅 Amazon Redshift 文档中的[对表执行 vacuum 操作](https://docs.aws.amazon.com/redshift/latest/dg/t_Reclaiming_storage_space202.html)。

#### 分析
<a name="analyze"></a>

`ANALYZE` 操作会更新 Amazon Redshift 数据库中表的统计元数据。通过允许查询计划程序选择最佳计划，使统计数据保持最新可提高查询性能。Amazon Redshift 持续监控您的数据库，并自动在后台执行分析操作。为了最大限度地降低对系统性能的影响，`ANALYZE` 操作将在工作负载较轻的时段自动运行。如果您选择显式运行 `ANALYZE`，请执行以下操作：
+ 在运行查询之前运行 `ANALYZE` 命令。
+ 在每次定期加载或更新循环结束时，常规性地对数据库运行 `ANALYZE` 命令。
+ 对您创建的新表和正在进行重大更改的现有表或列运行 `ANALYZE` 命令。
+ 考虑按不同计划对不同类型的表和列运行 `ANALYZE` 操作，具体取决于它们在查询中的使用和它们的更改倾向。
+ 为节省时间和集群资源，在运行 `ANALYZE` 命令时请使用 `PREDICATE COLUMNS` 子句。

## 集群配置
<a name="cluster-configuration"></a>

集群是多个节点组的集合，这些节点执行实际的数据存储和处理。如果您想实现以下目标，正确设置 Amazon Redshift 集群至关重要：
+ 高可扩展性和并发性
+ 高效使用 Amazon Redshift
+ 提升性能
+ 降低成本

### 节点类型
<a name="node-type"></a>

Amazon Redshift 集群可以使用多种节点类型之一（RA3 DC2、和 DS2）。每种节点类型都提供不同的大小和限制，以帮助您适当地扩展集群。节点大小决定集群中每个节点的存储容量、内存、CPU 和价格。成本和性能优化始于选择正确的节点类型和大小。有关节点类型的更多信息，请参阅 Amazon Redshift 文档中的 [Amazon Redshift 集群概览](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#working-with-clusters-overview)。

### 节点大小、节点数量和切片
<a name="node-size"></a>

一个计算节点分为多个切片。节点越多意味着处理器和切片越多，通过跨各个切片并发运行查询的多个部分，可加快查询的处理速度。不过，更多的节点也意味着更高的开支。这意味着您必须找到适合系统的成本与性能之间的平衡。有关 Amazon Redshift 集群架构的更多信息，请参阅 Amazon Redshift 文档中的[数据仓库系统架构](https://docs.aws.amazon.com/redshift/latest/dg/c_high_level_system_architecture.html)。

### 工作负载管理
<a name="workload-management"></a>

利用 Amazon Redshift 工作负载管理（WLM），用户能够通过优先级灵活地管理工作负载队列，以便时间较短的、快速运行的查询在队列中不会被长时间运行的查询阻碍。自动 WLM 使用机器学习（ML）算法来分析查询，并将其放入具有适当资源的相应队列中，同时管理查询并发性和内存分配。有关 WLM 的更多信息，请参阅 Amazon Redshift 文档中的[实施工作负载管理](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-implementing-workload-management.html)。

### 短查询加速
<a name="sqa"></a>

短查询加速（SQA）可让短时查询优先于长时查询。SQA 在专用空间中运行查询，因此 SQA 查询不会被迫排在队列中的长时查询后面等待。SQA 仅优先处理用户定义的队列中的短时查询。如果使用 SQA，短时查询会更快地开始运行，您可以更快地看到结果。如果您启用 SQA，则可以减少或消除专用于运行短查询的 WLM 队列。此外，长时查询无需争用 WLM 队列中的槽位。这意味着您可以将 WLM 队列配置为使用较少的查询槽位。如果您使用较低的并发度时，查询吞吐量会增加，而且大多数工作负载的总体系统性能会得到提高。有关 SQA 的更多信息，请参阅 Amazon Redshift 文档中的[使用短查询加速](https://docs.aws.amazon.com/redshift/latest/dg/wlm-short-query-acceleration.html)。

## SQL 查询
<a name="query"></a>

数据库查询是对数据库中数据发出的请求。请求应使用 SQL 发送到 Amazon Redshift 集群。Amazon Redshift 支持通过 Java 数据库连接（JDBC）和开放式数据库连接（ODBC）来连接 SQL 客户端工具。您可以使用支持 JDBC 或 ODBC 驱动程序的大多数 SQL 客户端工具。

### 查询结构
<a name="query-structure"></a>

查询的编写方式会显著影响其性能。我们建议您编写查询时，仅处理和返回满足需求必需的最少数据。有关如何构建查询的更多信息，请参阅本指南的[设计 Amazon Redshift 查询的最佳实践](best-practices-designing-queries.md)部分。

### 代码编译
<a name="code-compilation"></a>

Amazon Redshift 会为每个查询执行计划生成和编译经过优化的代码。编译代码执行更快，因为它消除了使用解释器的开销。*为了最大限度地减少新查询的延迟，同时保留编译代码的性能优势，Amazon Redshift 使用了一种称为组合的技术。*组合生成预先存在的逻辑的轻量级排列，以便立即处理新查询，同时在后台编译高度优化的查询专用代码。这会将编译从查询执行的关键路径中移除。这意味着新查询可以更快地启动并提供与后续运行一致的性能。

Amazon Redshift 还使用无服务器编译服务将查询编译扩展到亚马逊 Redshift 集群的计算资源之外。编译后的代码段既可以在集群上本地缓存，也可以在集群重启后保留的几乎无限的远程缓存中。相同查询的后续执行可以更快地运行，因为它们可以跳过编译阶段。通过使用可扩展的编译服务，Amazon Redshift 可以并行编译代码，从而提供始终如一的快速性能。